Avatar billede staf Nybegynder
05. juli 2007 - 14:25 Der er 4 kommentarer

Liste "nul"-værdier med COUNT og "GROUP BY" og vise i "web"-skema

Hejsa,

jeg har et lille problem som jeg ikke umiddelbart kan finde en løsning på.
Sagen er den at jeg har en reklamations database med bla. flg. 2 kolonner:

|Fejltype|afdeling|.........................

Hver række i databasen repræsentere således en reklamation. Jeg er så igang med at lave en webbasseret oversigt. I denne oversigt har jeg et skema hvor jeg lister og tæller forkomsten af hver enkelt fejltype med flg. SQL:

antalmedfejltype_complaint = "SELECT(fejltype), Count(*) as fejltyper_complaints FROM (MIN DB) Group by fejltype ORDER BY COUNT(fejltype) DESC, fejltype"

Dette virker helt fint!

I mit webskema har jeg så hver afdeling listet derud af. Dvs. jeg vil tælle forkomsten af fejltyper for hver afdeling (PT har jeg 6 afdelinger). Dette gør jeg med flg.:

samletantalmedfejltype_complaints_afd1 = "SELECT(fejltype), COUNT(*) as totalantal_medfejltype_complaints_afd1 from (MIN DB) WHERE aar_for_reklamation='2007' AND afdeling='afd1' GROUP BY fejltype ORDER BY COUNT (fejltype) DESC, fejltype"

Når jeg udskriver denne tæller den således forekomster af hver fejltype fra pågældende afdeling. Dette er også fint nok, men det jeg egentlig gerne ville i mit web skema var at der for hver afdeling ALTID listes et antal udfor fejltype. DVS. hvis den pågældende fejltype ikke forekommer i en specifik afdeling, ja så skal der stå nul !!! Som det er nu for jeg måske kun et "result set" på 5, ved en af afdelingerne!! Jeg er også godt klar over at jeg i min SQL sætning IKKE kan tælle på noget der ikke eksistere DVS. er NULL. Men er det på nogle måder muligt at: Lave en COUNT der først tager højde for ALLE forekomster af fejltyper, dernæst tæller disse (med group by) med en specifik afdeling som kriterie ??

Dvs. således at jeg kunne udskrive(med ASP) et skema der eks. kunne se således ud:

----------------------------------------
fejltype | Afdeling1 | Afdeling2 | osv... osv....
----------------------------------------
fejltype_1|        5 |      3
fejltype_2|        4 |      2
fejltype_3|        0 |      0
fejltype_4|        0 |      1
fejltype_5|        2 |      0
fejltype_6|        1 |      5
fejltype_7|        0 |      3
fejltype_8|        7 |      0
Osv...


-------------------------------------------------------------


Er det overhovedet muligt i ren SQL eller hvorledes.

Skriv endelig hvis jeg skal uddybe det, det er lidt tricky at forklare nemlig.


100 point til en der kan lede mig til en løsning.
Avatar billede lorentsnv Nybegynder
06. juli 2007 - 11:19 #1
Det nemmeste er hvis du har en tabel med alle afdelinger og en tabel med alle fejltyper. Disse tabeller kan du lave en crossjoin på. Derefter joiner du dette resultat med din sql hvor du teller op antal fejl for hver afdeling/fejltype.

Noget i retning af

Select cj.Afdeling, cj.Fejtype, IsNull(res.AntalFejl,0) as AntalFejl
From (
      Select a.Afdeling, f.Fejltype
      From tblAfdelinger a crossjoin tblFejltyper f
    ) cj    --Den inderste select skal tildeles et navn, f.eks cj for crossjoin.
Left Join
    (
      SELECT afdeling, fejltype,  COUNT(*) as AntalFejl
      from (MIN DB)
      WHERE aar_for_reklamation='2007'
      GROUP BY afdeling, fejltype
    ) res
on cj.afdeling = res.afdeling and cj.fejltype = res.fejltype
Avatar billede staf Nybegynder
06. juli 2007 - 15:10 #2
Som det er lige nu har jeg kun 1 tabel. I den tabel har jeg bla. de omtalte kolonner. Ned igennem tabellen kan en specifik fejltype samt afdeling sagtens forekomme flere gange (ved godt det ikke er en optimal måde), men vil helst undgå at lave hele strukturen om indtil videre.
Dvs. min tabel ser fx. ud ala nedenstående:


[TABEL]
________________________________________________________________
--------|Fejltype|-|Afdeling|............osv....osv.............
RECORD_1| Fejl1  |-|  afd2  |............osv....osv.............
RECORD_2| Fejl5  |-|  afd3  |............osv....osv.............
RECORD_3| Fejl4  |-|  afd6  |............osv....osv.............
RECORD_4| Fejl3  |-|  afd1  |............osv....osv.............
RECORD_5| Fejl3  |-|  afd1  |............osv....osv.............
RECORD_6| Fejl5  |-|  afd3  |............osv....osv.............
________________________________________________________________




Jeg vil så udskrive en oversigt hvor jeg med Bla. DISTINC lister alle forekomne fejltyper. Udfor hver fejltype tæller jeg så op hvor mange gange de optræder hver især.
Når jeg så vil lave en optælling for hver enkelt afdeling op er det jo ikke sikkert at alle fejltyper optræder, og jeg for så et result_set på måske kun 5 optælinger. Hvis jeg så har 20 fejltyper kan jeg ikke placere optællingerne korrekt udfor hver fejl i et skema.

Sådan som jeg gerne ville have det til at se ud (med udgangspunkt i ovenstående eks.) er:



[OVERSIGT] som jeg forestiller mig den kommer til at se ud
________________________________________________________________
-----|Fejltype|-|Afdeling1|-|Afdeling2|-|Afdeling3|-|Afdeling6|
Fejl1|  1    |-|    0    |-|    1    |-|    0    |-|    0    |
Fejl3|  2    |-|    2    |-|    0    |-|    0    |-|    0    |
Fejl4|  1    |-|    0    |-|    0    |-|    0    |-|    1    |
Fejl5|  2    |-|    0    |-|    0    |-|    2    |-|    0    |
________________________________________________________________




Så det jeg spekulere på er om man kan evt. kan lave en select der: Først tager højde for hvor mange forskellige fejltyper der findes i tabellen. Derefter tæller hvor mange gange hver enkelt fejl optræder i en specifik afdeling. Og når man så "Respons writer`er" hele møjet, giver et Result_set hvor den for hver plads/fejl sætter et 0 som udganspunkt MED MINDRE fejlen optræder i den specifikke afdeling. Så skal det så sætte det pågældende antal istedet ?!?


Jeg er ikke SUPER haj i SQL, så du må meget gerne uddybe og forklarer. Og jeg er vilig til at give flere point for det. Ville nemlig gerne have det til at funge inden jeg går på sommerferie.




SORT...Tjooo! Dælme svært at forklare ihvertfald.
Avatar billede lorentsnv Nybegynder
06. juli 2007 - 15:37 #3
I din oversigt, placerer du afdelinger som kolonner. Forventer du at SQL-resultatet også indeholder afdeliger som kolonner? Det kan lade sig gøre, nemmest ipå SQL Server 2005, hvor du skal bruge PIVOT. Jeg har ikke brugt denne funktion selv, men ved at søge på Pivot og SQL Server, kan du finde nødvendig info.

Som jeg forstår dig, vil du sikkre dig, at du får alle fejltyper representeret ved alle afdelinger?
Avatar billede staf Nybegynder
06. juli 2007 - 16:05 #4
Det er korrekt forstået. Og så skal der bare listes 0 i de rækker hvor fejltypen ikke forekommer. Jeg forestiller mig at lave en søgning for hver afdeling, så den skal ikke indeholde alle afdelinger i en samlet søgning. Men derimod en optælling der tager SAMLIGE forekomster af fejltype med. Og altså liste 0 eller et andet tal afhængig af om den forekommer. PT har jeg som sagt "hutlet" lidt med noget ala:

samletantalmedfejltype_complaint_afd1= "SELECT(fejltype), COUNT(*) as totalantal_medfejltype_complaints_afd1 from MIN DB WHERE aar_for_reklamation='2007' AND afdeling='afd1' GROUP BY fejltype ORDER BY COUNT (fejltype) DESC, fejltype"

Men det giver mig jo kun et resultat NÅR fejltypen forekommer!

Min database er iøvrigt en access DB så jeg ved ikke om det er den forkerte kategori. Tænkte bare det var et rent SQL/scripting sp.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester