Avatar billede ihtezaz Praktikant
17. maj 2010 - 22:20 Der er 16 kommentarer og
2 løsninger

select statment skal vises som kolonner

Hej,

Jeg har et tabel kaldet kundekoeb, der indeholder en kolonne kaldet prod_id. Prod_id indeholder forkortet navn på produkter f.eks. mob, com.

I tabellen kan jeg ud fra et kundenr finde produkter i kundekoeb tabellen som kunden har købt.

Når jeg laver en select på kundekoeb ud fra f.eks. kundenr 1234
så får jeg vist data på denne måde:

Kundenr  prod_id
1234      mob
1234      com

Jeg vil i stedet gerne have vist data på en af løsninger

Løsning 1
Kundenr  prod_id
1234      mob,com

Løsning 2
kundenr mob  com
1234    ja    ja


Ved løsning 1, går jeg ud fra jeg skal brug concat funktion, men hvordan jeg præcist gør det, kan jeg ikke komme på.

På forhånd tak.
Avatar billede janmanden Nybegynder
17. maj 2010 - 22:49 #1
Du ville egentlig gerne have, hvis der var en streng baseret summation (concatenation) med en group by, hvis bare der var en list funktion, der samlede værdier efter group by.

SELECT kundenr, LIST(prod_id) FROM kundekoeb GROUP BY kundenr.

Men det kan man så bare ikke lige på den måde, så vidt jeg ved (og der er ikke ret meget, hehe). 

Hvis der er et endeligt antal af produkter som du vil have kan du jo prøve at lave en select for hver inde i hoved SQL

SELECT DISTINCT kundenr,
(SELECT prod_id FROM kundekoeb WHERE prod_id='mob') AS p1, (SELECT prod_id FROM kundekoeb WHERE prod_id='com') AS p2
FROM kundekoeb
WHERE kundenr = 1234
Avatar billede janmanden Nybegynder
17. maj 2010 - 22:52 #2
Nå ja, subqueries skal selvfølgelig linkes op til hovedforespørgslen, men det var selvfølgelig underforstået.

SELECT DISTINCT kundenr,
(SELECT pk1.prod_id FROM kundekoeb AS pk1 WHERE pk1.prod_id='mob' AND pk1.kundenr = kk.kundenr) AS p1, (SELECT pk2.prod_id FROM kundekoeb AS pk2 WHERE pk2.prod_id='com' AND pk2.kundenr = kk.kundenr) AS p2
FROM kundekoeb AS kk
WHERE kundenr = 1234
Avatar billede janus_007 Nybegynder
17. maj 2010 - 23:46 #3
Ja det er en rimelig almindelig problemstilling, i virkeligheden burde den slags jo nok løses i applikationen :)

Anyway... jeg lavede en lille artikel om det her, hvordan det klares i T-Sql: http://janusknudsen.dk/post/T-SQL-Pivot-String-Concatenation-without-XML.aspx
Avatar billede janus_007 Nybegynder
17. maj 2010 - 23:48 #4
janmanden-> din løsning fungerer ikke, hvad nu hvis der var mere eller mindre end 2?
Avatar billede ihtezaz Praktikant
17. maj 2010 - 23:56 #5
Du er en stjern, en stjerne idé. Smid svar
Avatar billede janus_007 Nybegynder
18. maj 2010 - 00:39 #6
Et svar mere :O)
Avatar billede janmanden Nybegynder
18. maj 2010 - 00:42 #7
Jeg skriver "hvis der et endeligt antal" og selvfølgelig så må ihtezaz vide hvad der af muligheder i hans egen tabel, så hvis han har 10 forkortelser så laver han bare 10 subqueries. Det er bestemt ikke dynamisk eller så elegant som det du linker til, men det virker og det fordeler data på kolonner. Hvis han endvidere navngiver alias med prod_id, så giver det jo unægteligt mere mening. Men pyt nu med.
Avatar billede janus_007 Nybegynder
18. maj 2010 - 12:28 #8
janmanden-> Det er ikke sådan man programmerer noget, tingene skal laves ordentligt og robust og modsat gængs opfattelse så tager det ca. den samme tid :)
Avatar billede janmanden Nybegynder
18. maj 2010 - 13:26 #9
Janus->Det er ikke sådan man skal generalisere, forslag skal betragtes ud fra deres kontekst. Og her er et meget konkret tilfælde.

Koden er specifik og robust, men ikke dynamisk som nævnt et par gange nu. Det er ikke nogen god løsning at lave i SQL. Jeg ville foretrække at flytte noget af arbejdet til script i f.eks. php eller asp for at gøre det mere anvendeligt, men det var ikke lige spørgsmålet.

At klaske alle produkt kolonner sammen til et felt er måske den ene af løsninger og uden tvivl den smarteste, men det gør ikke ligefrem arbejdet nemmere og det skaber bestemt heller noget godt overblik. Det er da heldigt at han kigger på et produkt for hvis der var flere så blev det da noget værre rod at kigge på. Er det du mener med ordentligt og robust? :P
Avatar billede ihtezaz Praktikant
18. maj 2010 - 15:15 #10
Hej janmanden, det virkede til det jeg skulle bruge det til, da det kun var et udtræk jeg skulle lave, så smid et svar.
Avatar billede ihtezaz Praktikant
18. maj 2010 - 15:17 #11
Tak Janus, jeg til at læse din løsning også, jeg deler points i mellem jer.
Avatar billede janus_007 Nybegynder
18. maj 2010 - 19:09 #12
janmanden-> Det er ikke at generalisere, det er at tænke sig om inden man koder noget. Det vælter rundt med dårlig kode, alle tror efterhånden de kan banke noget sammen, men det kræver omtanke at lave noget godt og robust. Derfor giver jeg sjældent løsninger ud, men vil langt hellere i dialog med problemstilleren og på den måde løse det bedst.

Min mantra: Fight bad code!

"Koden er specifik og robust, men ikke dynamisk som nævnt et par gange nu."

I softwaresammenhæng betyder robust ikke det du mener!

"Det er ikke nogen god løsning at lave i SQL. Jeg ville foretrække at flytte noget af arbejdet til script i f.eks. php eller asp for at gøre det mere anvendeligt, men det var ikke lige spørgsmålet. ""

Det har vi vidst aldrig været uenige om, det afhænger dog i høj grad af situationen, men generelt :)


SELECT DISTINCT kundenr,
(SELECT pk1.prod_id FROM kundekoeb AS pk1 WHERE pk1.prod_id='mob' AND pk1.kundenr = kk.kundenr) AS p1, (SELECT pk2.prod_id FROM kundekoeb AS pk2 WHERE pk2.prod_id='com' AND pk2.kundenr = kk.kundenr) AS p2
FROM kundekoeb AS kk
WHERE kundenr = 1234


Den kode vil jo aldrig komme til at virke lige end i det specielle tilfælde, du hardcoder jo prod_id, det ligner dog kode, men er det ikke :) Så kan man jo ligeså godt skrive det!
Avatar billede janus_007 Nybegynder
18. maj 2010 - 19:13 #13
Og nej jeg mener ikke pointene skal deles, men det er op til dig!
janmanden har ikke bidraget med noget kodemæssigt, udover spørgsmål indpakket som svar *GG* - du vil finde ud af at selecten ikke fungerer.
Avatar billede Syska Mester
19. maj 2010 - 22:47 #14
haha,

Sjov side at se dig fra Janus, jeg har ikke set dig før tale ned til folk, og det synes jeg ikke godt om, men godt at du argumentere for dine valg ... men giver dig ret, fight bad code.

Om det virker pas.

Måske jeg skulle læse din artikel om emnet.

mvh
Avatar billede Syska Mester
19. maj 2010 - 22:49 #15
Læst og ville det ikke være hurtigere med sådan en Custom Aggregate ?

Bare for også at gøre det lidt flottere eller er functions i sql ligeså hurtige ?
Avatar billede janus_007 Nybegynder
19. maj 2010 - 23:06 #16
Det er også meget sjældent det sker, men når janmanden slet ikke kan se hvad han selv har skrevet så ophører mine pædagogiske evner sku nok...

hmm, jeg tror nu nok til den slags simple ting at de performer nogenlunde ens. Det er nok mere når man kommer i gang med store stringmanipulationer og kompleks logik at CLR vil være en fordel.
Avatar billede Syska Mester
19. maj 2010 - 23:16 #17
Ja ... jeg tænker bare højt :-) Det kan altid give noget godt feedback. Nu snakkede vi jo også optimering og gøre det på den bedste måde, så synes det kunne være sjovt at høre om.

mvh
Avatar billede janus_007 Nybegynder
20. maj 2010 - 00:35 #18
Jamen helt enig... det er faktisk også langt sjovere og mere givende at tale om tingene end bare smide resultater på bordet :)
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

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