19. juni 2006 - 20:04Der er
20 kommentarer og 1 løsning
select en masse rækker, sorter og fravælg på en enkelt column
Jeg har en kæmpe liste over firmaer hvor jeg gerne vil hente deres ID, navn, CVR, addresse og ZIP kode. Desværre er et firma som f.eks. BlockBuster listet 25 gange fordi hver enkelt afdeling er listet med sin egen addresse.
Hver afdeling har dog det samme CVR nummer, så jeg vil egentlig blot gerne kun have én gang BlockBuster med i resultatet for min SELECT.
Hvordan kan jeg sortere distinct kun på CVR nummere?
Jeg har det her indtil videre:
SELECT COMPANY.COMPANY_ID, COMPANY.NAME, COMPANY.POSTAL_CODE, COMPANY.CVR, COMPANY.OWNER, COMPANY.TDC_ID FROM COMPANY WHERE (COMPANY.NUM_EMPLOYEES >= '100') AND (COMPANY.POSTAL_CODE BETWEEN '1000' AND '1165')
Jeg vil helst gerne gøre det hele i en enkelt query, bare for at være besværlig :-) (og fordi CRM systemet er irriterende).
SELECT DISTINCT COMPANY.COMPANY_ID, COMPANY.NAME, COMPANY.POSTAL_CODE, COMPANY.CVR, COMPANY.OWNER, COMPANY.TDC_ID FROM COMPANY WHERE (COMPANY.NUM_EMPLOYEES >= '100') AND (COMPANY.POSTAL_CODE BETWEEN '1000' AND '1165')
Jeg arbejder med jasper og det hjalp ikke - da der er forskellige addresser er de jo alle overordnet DISTINCT, men der skal vælges én fra hver unik CVR.
DISTINCT har kun effekt på det umiddelbart efterfølgende felt, så det I skal bruge er nærmere:
SELECT DISTINCT COMPANY.CVR, COMPANY.COMPANY_ID, COMPANY.NAME, COMPANY.POSTAL_CODE, COMPANY.OWNER, COMPANY.TDC_ID FROM COMPANY WHERE (COMPANY.NUM_EMPLOYEES >= '100') AND (COMPANY.POSTAL_CODE BETWEEN '1000' AND '1165')
Ved ikke lige om dette virker i mySQL - virker i MSSQL
SELECT COMPANY.CVR, COMPANY.NAME, ( SELECT top 1 C.COMPANY_ID FROM COMPANY C WHERE C.CVR = COMPANY.CVR ORDER BY C.ID ) As COMPANY_ID, ( SELECT top 1 C.POSTAL_CODE FROM COMPANY C WHERE C.CVR = COMPANY.CVR ORDER BY C.ID ) As POSTAL_CODE FROM COMPANY WHERE (COMPANY.POSTAL_CODE BETWEEN 1000 AND 1165) GROUP BY COMPANY.CVR, COMPANY.NAME HAVING SUM(COMPANY.NUM_EMPLOYEES) >= 100
Medtager kun firmaer med afdelinger i området 1000 og 1165, og med over 100 ansatte ialt.
Kan ikke nøjes med GROUP BY COMPANY.CVR hvis adressen skal udtrækkes direkte, da denne (adressen og andre kolonner) også skal medtages i GROUP BY - gætter på at dette også er kravet i MySQL
faktisk ikke - en mystisk feature i MySQL er at man godt kan angive ikke aggregerede funktioner i select listen som ikke er i GROUP BY, saa tager MySQL en tilfaeldig vaerdi
SELECT C1.COMPANY_ID, C1.NAME, C1.POSTAL_CODE, C1.CVR, C1.OWNER, C1.TDC_ID FROM COMPANY C1 WHERE (C1.NUM_EMPLOYEES >= '100') AND (C1.POSTAL_CODE BETWEEN '1000' AND '1165') AND (C1.COMPANY_ID IN (SELECT MIN(C2.COMPANY_ID) FROM COMPANY C2 WHERE C2.CVR=C1.CVR))
Nej, du behøver ikke have samme felter i select listen, som i group by listen.
Det betyder bare at den tager en tilfældig række (adresse) blandt de grupperede.
Derfor ville jeg gerne vide hvilken adresse du gerne ville have :)
SELECT COMPANY.COMPANY_ID, COMPANY.NAME, COMPANY.POSTAL_CODE, COMPANY.CVR, COMPANY.OWNER, COMPANY.TDC_ID FROM COMPANY WHERE (COMPANY.NUM_EMPLOYEES >= '100') AND (COMPANY.POSTAL_CODE BETWEEN '1000' AND '1165') GROUP BY COMPANY.CVR
arne_v, whee - dit forslag virker og returnerer kun én BlockBuster ud af de mange som har samme CVR. Det eneste negative er at den tager meget lang tid at køre - før var opslaget på under et sekund, nu er det "41 rows fetched (106,39 sec)" når jeg kører en query. Er der nogen måde at optimere det på?
hjochums, det er faktisk ligegyldigt hvilken af addresserne der vælges - der skal blot kun vælges ét firma for hver gang der er flere ens CVR numre.
Syntes ikke, at jeg kan få sql'en fra arne_v til at stemme.
Hvis du har følgende BlockBuster's (sidste kolonne skulle være POSTAL_CODE) 2 BlockBuster 1111 5000 3 BlockBuster 1111 6000 4 BlockBuster 1111 7000 5 BlockBuster 1111 8000
og laver søgning på POSTAL_CODE mellem 7500 og 8500 - giver det intet resultat, da Id'et på 5 ikke findes i (C1.COMPANY_ID IN (SELECT MIN(C2.COMPANY_ID) FROM COMPANY C2 WHERE C2.CVR=C1.CVR))
Burde kunne lade sig gøre med en GROUP BY istedet subselects er langsome..
SELECT COMPANY.COMPANY_ID, COMPANY.NAME, COMPANY.POSTAL_CODE, COMPANY.CVR, COMPANY.OWNER, COMPANY.TDC_ID FROM COMPANY GROUP BY COMPANY.CVR HAVING (COMPANY.NUM_EMPLOYEES >= '100') AND (COMPANY.POSTAL_CODE BETWEEN '1000' AND '1165')
ja group by var også det første jeg tænkte på, men det virker af en eller anden grund ikke i crm systemet. Men tak for alle svar.
Synes godt om
Ny brugerNybegynder
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.