Hogyan lehet nullát visszaadni az SQL-ben
Üdv!
Egyszerű feladattal nem boldogulok. Láttam sok kódot a Neten, de nem tudtam megoldani.
Mysql adatbázisban van egy matek táblám, benne egy "mego" (varchar) oszlop melyben 'jó' vagy 'rossz' értékek vannak. Ugyanebben a táblában van még "ido" (datetime) oszlop melyben a megoldás ideje van tárolva /2020-09-01 06:59:21/ formában. Van még id int(5) azonosító.
Szeretném kilistázni adott id azonosítójú felhasználó elmúlt 7 napi megoldásainak a számát.
Nem tudom kiíratni a 0 számot.
Próbálkoztam, de nem sikerült.
SELECT
SUM(CASE WHEN mego='Jó' THEN 1 ELSE 0 END) AS jo
FROM matek
where'$id' = id
group by DATE(ido) ORDER BY ido desc Limit 7
■ Egyszerű feladattal nem boldogulok. Láttam sok kódot a Neten, de nem tudtam megoldani.
Mysql adatbázisban van egy matek táblám, benne egy "mego" (varchar) oszlop melyben 'jó' vagy 'rossz' értékek vannak. Ugyanebben a táblában van még "ido" (datetime) oszlop melyben a megoldás ideje van tárolva /2020-09-01 06:59:21/ formában. Van még id int(5) azonosító.
Szeretném kilistázni adott id azonosítójú felhasználó elmúlt 7 napi megoldásainak a számát.
Nem tudom kiíratni a 0 számot.
Próbálkoztam, de nem sikerült.
SELECT
SUM(CASE WHEN mego='Jó' THEN 1 ELSE 0 END) AS jo
FROM matek
where'$id' = id
group by DATE(ido) ORDER BY ido desc Limit 7
where'$id' = id Ezt
Ezt részleteznéd, hogy mit akar jelenteni?
A kívánt felhasználó id-ja
Valami olyan, hogy Select
nem segít?
Jó rég volt, nem vállalok felelősséget érte! ;)
Pontatlan voltam. El kellene
El kellene tenni egy változóba a kapott értéket. Diagram lesz belőle.
Szerintem a sum(when felt
és a count(*) ... group by ... having felt ... azonos eredményt kellene, hogy adjon, de nem szintaktikai gondod van?
Nem sum(case mego when 'Jó' then 1 else 0 end) a helyes szintaxis?
Amit írtál az lefut csak nem
Itt is láttam hasonlót, meg még máshol is.
Innen kezdve szinte szó
Én valaha Oracle-lel dolgoztam, de már abból sincs sok emlékem, mysql-ről meg csak a sok évvel ezelőtti tutorialok maradéka.
Ha az lefut, amit írtam, akkor két dolog kérdéses:
1. A tiéd mit tesz helyette, mert a linkelt példád szerint szintaktikailag az is OK.
2. Az enyém mit csinál rosszul? Miből gondolod, hogy nem adja ki a 0-t?
Kicsit egyszerűbb lenne, ha mutatnál logokat a futásról, eredményekkel, hibaüzenetekkel.
Kiiratom a jo változó
Jó= 2 Jó= 7 Jó= 8 Jó= 4 Jó= 8 Jó= 12 Jó= 22
Kimaradnak a nullák.
Az adatbázisban lévő
Mint itt
Bocs ha félreérthető voltam.
Ja... Hát nem pont ezt
Hiányzó sorokat szerintem nem fog neked pótolni semmi.
De elnézve a hivatkozott posztot, nagy tétben nem fogadnék erre.
A korábbi link szerin null-t
A 3. válasz szerint lehet. (vagy tévedek?)
Bocs, képtelen vagyok teljes
Azért majd később ranezek, hátha látok benne valami egyebet is. (Egyáltalán az mysql?)
Update: pardon, ez a hülye mobilos böngésző pont a lényeget vágta le a példából... Továbbra is feltételezd, hogy hülyeségeket beszélek, de...
Amikor a feltétel a WHERE-ben van, akkor a szerver csak azokat a sorokat veszi figyelembe, amelyek megfelelnek a feltételnek. Ha olyan van a WHERE-ben, ami érvényes minden napról legalább egy sorra és a count-ba teszed azt a CASE-t, akkor minden napra kapsz (legalább) egy eredménysort, a count viszont csak azokat számolja, ahol a beleírt érték - itt a CASE által visszaadott érték - nem NULL.
Nem tudom, ez így érthető?
Érzésem szerint az a különbség, hogy nálad talán eleve hiányoznak bizonyos napok az adatbázisból... De csak tipp.
Csak megértetem magam.
Amikor van jó vagy rossz megoldás az bekerül az adatbázisba. Amikor nincs munkavégzés akkor nincs adat arról a napról. A diagramban itt nullát kéne ábrázolnom.
A jó megoldások számát akarom ábrázolni diagramban. Ha nem dolgozott nincs adat a kimaradt napokon. Nincs mit ábrázolni, ez lenne a nulla.
Ezt (hangsúlyozom, szerintem)
Minimum egy tárolt eljárás kell, ami végigpörgeti a napokat, minden egyes naphoz lekéri az aznapi adatokat és amelyikhez nincs adat, arra nullát mutat.
De mondom: szerintem így van. Hogy azóta mennyire változtak a dolgok, mióta én néztem... Passz.
Köszi mindent.
SQLFiddle
De ha
NULL
értékek okoznak problémát, akkor aCOALESCE()
függvény a barátod.CREATE TABLE `matek` ( `id`
`id` int(5) NOT NULL,
`ido` datetime NOT NULL,
`mego` varchar(5) CHARACTER SET utf8 COLLATE utf8_hungarian_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `matek` ( `id`, `ido`, `mego`) VALUES
(26, '2020-09-01 19:31:01', 'Jó'),
(26, '2020-09-01 19:31:05', 'Jó'),
(26, '2020-09-03 14:24:52', 'Jó'),
( 5, '2020-09-03 14:25:02', 'Jó');
Ha kiválasztom a id=26 azonosítóval rendelkező felhasználót, akkor
2020-09-01 napra kettőt kell kapni,
2020-09-02 nincs bejegyzés, itt nullát kell kapni,
2020-09-03 napra egyet kell kapni
Inkább alkalmazás oldal
curdate()
helyett megfelelő paramétert beadva bármilyen dátum lekérdezhető.Tökéletes. Köszönöm a
Törölve
Kimaradnak napok. pl. Ezekre
pl. Ezekre az adatokra:
CREATE TABLE `matek3` (
`id` int(5) NOT NULL,
`ido` datetime NOT NULL,
`mego` varchar(5) CHARACTER SET utf8 COLLATE utf8_hungarian_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `matek3` ( `id`, `ido`, `mego`) VALUES
(26, '2021-04-15 19:31:01', 'Jó'),
(26, '2021-04-18 19:31:05', 'Jó'),
(26, '2021-04-18 14:24:52', 'Jó'),
( 5, '2021-04-18 14:25:02', 'Jó');
Ezzel a kóddal:
SELECT
qt.nap,
SUM(CASE WHEN mego='Jó' THEN 1 ELSE 0 END) AS jo
FROM (
SELECT DATE_SUB(curdate(), INTERVAL 0 day) AS nap UNION
SELECT DATE_SUB(curdate(), INTERVAL 1 day) AS nap UNION
SELECT DATE_SUB(curdate(), INTERVAL 2 day) AS nap UNION
SELECT DATE_SUB(curdate(), INTERVAL 3 day) AS nap UNION
SELECT DATE_SUB(curdate(), INTERVAL 4 day) AS nap UNION
SELECT DATE_SUB(curdate(), INTERVAL 5 day) AS nap UNION
SELECT DATE_SUB(curdate(), INTERVAL 6 day) AS nap UNION
SELECT DATE_SUB(curdate(), INTERVAL 7 day) AS nap UNION
SELECT DATE_SUB(curdate(), INTERVAL 8 day) AS nap UNION
SELECT DATE_SUB(curdate(), INTERVAL 9 day) AS nap UNION
SELECT DATE_SUB(curdate(), INTERVAL 10 day) AS nap
) AS qt
LEFT JOIN
matek3 m
ON qt.nap=DATE(m.ido)
WHERE
(id=23 OR id IS NULL)
GROUP BY
DATE(qt.nap)
ORDER BY
qt.nap ASC
Ezt az eredményt adja:
2021-04-11 Jó= 0
2021-04-12 Jó= 0
2021-04-13 Jó= 0
2021-04-14 Jó= 0
2021-04-16 Jó= 0
2021-04-17 Jó= 0
2021-04-19 Jó= 0
2021-04-20 Jó= 0
2021-04-21 Jó= 0
Az (id=5 OR id IS NULL) esetén kimarad a 2021-04-15.
Mit csinálok rosszul?
Az önálló feltételt csapd
Így már jó. Köszi újra.
Köszi újra.
A 3. válasz szerint lehet.
Viszont a te esetedben magát a dátum intervallumot kell generálni, ami CTE-vel így néz ki:
Plusz egy tanács:
where'$id' = id
helyett inkább szokj rá az SQL paraméter használatára.where :id = id
vagywhere ? = id
, attól függ mit használsz.Köszönöm a segítséget.
Ez milyen sql? Őőő… MySQL.
Őőő… MySQL. Bár attól tartok nem ezt kérdezhetted.
Szerintem de, mert ez bennem
Nekem nem fut le saját gépen.
mysqlnd 5.0.11-dev verziót használok.
Bocs, pontosítok: MySQL 8.0
Vagy ha esetleg MariaDB is akad kézügyben, az már a 2016-ban megjelent 10.2 óta tudja.
Ott 8.4 óta lehetséges, ami 2009-ben jelent meg.
Még a viszonylag egyszerű SQLite is már 2014-ben megkapta a támogatást a 3.8.3-as verzióval.
Oracle és MSSQL dokumentációk már nem is említik, annyira alapnak számít, hogy a kezdetek a feledés homályába vesztek.