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.jpgOg jeg ville gerne hvis den kunne blive mere lign. den her:
http://i.stack.imgur.com/m7SQg.jpgJeg 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--
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
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
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