Vinnaren i pepparkakshustävlingen!
2018-04-27, 11:01
  #1
Medlem
Jag har en tabell enligt följande:

datum date,
completeness int

I tabellen kan det finnas flera rader med ett datum och värdet 0. Varje sådan rad betyder ett misslyckande. Likaså finns det rader med ett datum och värdet 100 som betyder lyckad.

Så finns det t ex 5 st rader, '2018-02-11' | 0 så betyder det fem misslyckanden det datumet, medan om det står 4 st '2018-02-12' | 100 så betyder det att det har varit 4 st lyckande det datumet.

Nu vill jag räkna ihop dessa värden och få en tabell som ser ut som:

Datum | Misslyckanden | Lyckanden
--------------------------------------
2018-02-11 | 5 | 0
2018-02-12 | 0 | 4


Hur gör man det?
Citera
2018-04-27, 11:51
  #2
Medlem
Detta är en lösning:

Kod:
SELECT date, SUM( IF( completeness = 0, 1, 0 ) ) as fails, SUM( IF( completeness = 100, 1, 0 ) ) as successes FROM table GROUP BY date
Citera
2018-04-27, 11:55
  #3
Medlem
MegaSkurts avatar
Kika på group by:

https://www.w3schools.com/sql/sql_groupby.asp
http://www.dofactory.com/sql/group-by

Och having:

https://www.w3schools.com/sql/sql_having.asp
Citera
2018-04-27, 14:32
  #4
Moderator
Protons avatar
Citat:
Ursprungligen postat av PN
Jag har en tabell enligt följande:

datum date,
completeness int

I tabellen kan det finnas flera rader med ett datum och värdet 0. Varje sådan rad betyder ett misslyckande. Likaså finns det rader med ett datum och värdet 100 som betyder lyckad.

Så finns det t ex 5 st rader, '2018-02-11' | 0 så betyder det fem misslyckanden det datumet, medan om det står 4 st '2018-02-12' | 100 så betyder det att det har varit 4 st lyckande det datumet.

Nu vill jag räkna ihop dessa värden och få en tabell som ser ut som:

Datum | Misslyckanden | Lyckanden
--------------------------------------
2018-02-11 | 5 | 0
2018-02-12 | 0 | 4


Hur gör man det?
Nåt sånt här?
Kod:
SELECT datum,ISNULL( tab1.num,0) AS Success, ISNULL(tab2.num,0) AS Rejects
FROM 
tab
LEFT OUTER JOIN(
SELECT datum, COUNT(*) AS num
FROM tab
WHERE completeness=1
GROUP BY datum) tab1 ON tab1.datum = tab.datum
LEFT OUTER JOIN(
SELECT datum, COUNT(*) AS num
FROM tab
WHERE completeness=0
GROUP BY datum) tab2 ON tab2.datum = tab.datum
ORDER BY tab.datum

"tab" får du givetvis byta mot det riktiga tabellnamnet, ISNULL är sql server-syntax, tror den heter IFNULL i mysql.
Citera
2018-04-28, 22:46
  #5
Medlem
fnirps avatar
Citat:
Ursprungligen postat av Proton
ISNULL är sql server-syntax, tror den heter IFNULL i mysql.

Jag rekommenderar att börja använda COALESCE istället. Det är SQL92-standard (om jag minns rätt) och stöds av de flesta databasmotorer.
Citera
2018-04-28, 23:52
  #6
Moderator
Protons avatar
Citat:
Ursprungligen postat av fnirp
Jag rekommenderar att börja använda COALESCE istället. Det är SQL92-standard (om jag minns rätt) och stöds av de flesta databasmotorer.
Tja, kan man ju göra med om man nu känner för det, personligen hade jag använd ISNULL dock, av den anledningen att det är det första jag tänker på när jag står inför ett sådant här problem.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback