Avatar billede patrickpetersen Nybegynder
16. juli 2015 - 13:54 Der er 5 kommentarer

JOIN og Pivot / dynamisk kolonne i SQL

Hey, jeg er ved at lave en lille marketingsopgave til mit studie og har downloadet alle danske adresser inde fra BBR/DAWA. Når jeg sætter anvendelseskode på, så sker det, at der kommer dubletter, da en adresse sagtens kan have mere end 1 bygning på, det vil jeg gerne have lidt mere dynamisk :)

Er der en som kan hjælpe mig?

Jeg har følgende kode jeg kører:
SELECT DISTINCT
  Anvendelseskoder.[Usage Code] AS [Byggeanvendelseskode],
  Anvendelseskoder.[Usage Code Value] AS [Byggeanvendelse],
  HeleDanmark_DAWA.KVHx
FROM Anvendelseskoder
  RIGHT JOIN HeleDanmark_DAWA
      ON Anvendelseskoder.KVHx = HeleDanmark_DAWA.KVHx
WHERE HeleDanmark_DAWA.postnr=6720 AND Anvendelseskoder.[Usage Code]>0

Det giver mig følgende output:
http://i.stack.imgur.com/t6NXi.jpg

Og jeg ville gerne hvis den kunne blive mere lign. den her:
http://i.stack.imgur.com/m7SQg.jpg

Jeg fandt noget der ligner rigtig meget på stackoverflow.com, men jeg kan simpelthen ikke få det til at passe ind i min kode!

Link til den jeg fandt:
http://stackoverflow.com/questions/7380887/using-pivot-and-join-together

--
Avatar billede Slettet bruger
16. juli 2015 - 14:42 #1
Med PIVOT vil du få Byggeanvendelseskode som kolonne-overskrift. Det er ikke helt det du vil?

En anden løsning kunne være denne:

WITH a AS (
SELECT DISTINCT
  Anvendelseskoder.[Usage Code] AS [Byggeanvendelseskode],
  Anvendelseskoder.[Usage Code Value] AS [Byggeanvendelse],
  HeleDanmark_DAWA.KVHx
FROM Anvendelseskoder
  RIGHT JOIN HeleDanmark_DAWA
      ON Anvendelseskoder.KVHx = HeleDanmark_DAWA.KVHx
WHERE HeleDanmark_DAWA.postnr=6720 AND Anvendelseskoder.[Usage Code]>0
)
,aa AS (
SELECT a.*, row_number() over(partition by KVHx order by Byggeanvendelseskode) Nr
FROM a
)
SELECT KVHx, Byggeanvendelseskode Kode1, Byggeanvendelse Anvend1
,(SELECT Byggeanvendelseskode FROM aa AS s2
  WHERE s2.Nr = 2
    AND s2.KVHx = aa.KVHx
) Kode2
,(SELECT Byggeanvendelse FROM aa AS s2
  WHERE s2.Nr = 2
    AND s2.KVHx = aa.KVHx
) Anvend2
,(SELECT Byggeanvendelseskode FROM aa AS s2
  WHERE s2.Nr = 3
    AND s2.KVHx = aa.KVHx
) Kode3
,(SELECT Byggeanvendelse FROM aa AS s2
  WHERE s2.Nr = 3
    AND s2.KVHx = aa.KVHx
) Anvend3
FROM aa AS s1
WHERE Nr = 1
Avatar billede patrickpetersen Nybegynder
16. juli 2015 - 14:45 #2
Jeg er kommet frem til følgende, men hvor den skriver overskrifterne og så 1 eller 0 i pivot-tabellen. Her ville jeg gerne have hvis den kunne give mig overskriften "Bygning 1", "Bygning 2" osv. og så med det der er overskriften nu som værdi

WITH Acode
    AS (SELECT
        HeleDanmark_DAWA.KVHx,
        Anvendelseskoder.[Usage Code],
        Anvendelseskoder.[Usage Code Value]
    FROM Anvendelseskoder
        RIGHT JOIN HeleDanmark_DAWA
            ON HeleDanmark_DAWA.KVHx = Anvendelseskoder.KVHx)
SELECT *
FROM Acode PIVOT( COUNT([Usage Code]) FOR [Usage Code Value] IN (
    [Stuehus til landbrugsejendom],
    [Fritliggende enfamilieshus (parcelhus).],
    [Række-, kæde- eller dobbelthus (lodret adskillelse mellem enhederne).],
    [Etageboligbebyggelse (flerfamiliehus, herunder tofamiliehus (vandret adskillelse mellem enhederne)).],
    [Kollegium],
    [Døgninstitution (plejehjem, alderdomshjem, børne- eller ungdomshjem).],
    [Anden enhed til helårsbeboelse],
    [Erhvervsmæssig produktion vedrørende landbrug, skovbrug, gartneri, råstofudvinding og lign.],
    [Erhvervsmæssig produktion vedrørende industri, håndværk m.v. (fabrik, værksted o. lign.)],
    [El-, gas-, vand- eller varmeværk, forbrændingsanstalt o. lign.],
    [Anden enhed til produktion og lager i forbindelse med landbrug, industri o. lign.],
    [Transport- og garageanlæg (fragtmandshal, lufthavnsbygning,banegårdsbygning o. lign.)],
    [Engroshandel og lager.],
    [Detailhandel m.v.],
    [Pengeinstitut, forsikringsvirksomhed m.v.],
    [Kontor og liberale erhverv bortset fra offentlig administration],
    [Offentlig administration.],
    [Hotel, restauration, vaskeri, frisør og anden servicevirksomhed.],
    [Anden enhed til handel, transport etc.],
    [Biograf, teater, erhvervsmæssig udstilling m.v.],
    [Bibliotek, museum, kirke o. lign.],
    [Undervisning og forskning (skole, gymnasium, forskningslaboratorium).],
    [Hospital, fødeklinik o. lign.],
    [Daginstitution.],
    [Anden institution, herunder kaserne, fængsel m.v.],
    [Sommerhus.],
    [Enhed til ferieformål m.v. bortset fra sommerhus (feriekoloni vandrehjem o. lign.)],
    [Enhed i forbindelse med idrætsudøvelse (klubhus, idrætshal, svømmehal o. lign.).],
    [Kolonihavehus.],
    [Anden enhed til fritidsformål.],
    [Ikke tidligere vurderet erhvervsenhed i nybyggeri],
    [Garage],
    [Carport],
    [Udhus]) ) AS pvt
Avatar billede patrickpetersen Nybegynder
16. juli 2015 - 16:03 #3
RAHP:
Du har ret, det er nemlig ikke det jeg vil.. Men det er det tætteste på jeg selv kunne finde ud af at komme!

Jeg prøver koden så snart jeg kan - Min SQL Server står lige og er ved at lave mig et udtræk af ovenstående så jeg kan se hvor mange bygninger der maksimalt er på kvhx-niveau :)
Avatar billede patrickpetersen Nybegynder
16. juli 2015 - 17:52 #4
Hej RAHP!

Jeg har prøvet at køre SQL'en og den giver følgende fejl:

Msg 208, Level 16, State 1, Line 1
Invalid object name 'Anvendelseskoder'.

Når jeg klikker på fejlen peger den op på den øverste linje.

Jeg har derfor prøvet at køre den med fuld "sti".
Databasen hedder Potentiale, så stien ville være Potentiale.dbo.tabel.kolonne, men det kan jeg heller ikke få til at virke :(
Avatar billede patrickpetersen Nybegynder
16. juli 2015 - 17:56 #5
Opdateret kode:

WITH a AS (
SELECT DISTINCT
  Potentiale.dbo.Anvendelseskoder.[Usage Code] AS [Byggeanvendelseskode],
  Potentiale.dbo.Anvendelseskoder.[Usage Code Value] AS [Byggeanvendelse],
  Potentiale.dbo.HeleDanmark_DAWA.KVHx
FROM Potentiale.dbo.Anvendelseskoder
  RIGHT JOIN Potentiale.dbo.HeleDanmark_DAWA
      ON Potentiale.dbo.Anvendelseskoder.KVHx = Potentiale.dbo.HeleDanmark_DAWA.KVHx
WHERE Potentiale.dbo.HeleDanmark_DAWA.postnr=6720 AND Potentiale.dbo.Anvendelseskoder.[Usage Code]>0
)
,aa AS (
SELECT a.*, row_number() over(partition by KVHx order by Byggeanvendelseskode) Nr
FROM a
)
SELECT KVHx, Byggeanvendelseskode Kode1, Byggeanvendelse Anvend1
,(SELECT Byggeanvendelseskode FROM aa AS s2
  WHERE s2.Nr = 2
    AND s2.KVHx = aa.KVHx
) Kode2
,(SELECT Byggeanvendelse FROM aa AS s2
  WHERE s2.Nr = 2
    AND s2.KVHx = aa.KVHx
) Anvend2
,(SELECT Byggeanvendelseskode FROM aa AS s2
  WHERE s2.Nr = 3
    AND s2.KVHx = aa.KVHx
) Kode3
,(SELECT Byggeanvendelse FROM aa AS s2
  WHERE s2.Nr = 3
    AND s2.KVHx = aa.KVHx
) Anvend3
FROM aa AS s1
WHERE Nr = 1
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