Join 出现重复值时,在sql server 2014中创建动态列
我正在运行以下sql:Join 出现重复值时,在sql server 2014中创建动态列,join,pivot,left-join,sql-server-2014,dynamic-columns,Join,Pivot,Left Join,Sql Server 2014,Dynamic Columns,我正在运行以下sql: SELECT DISTINCT Anvendelseskoder.[Usage Code] AS [Byggeanvendelseskode], Anvendelseskoder.[Usage Code Value] AS [Byggeanvendelse], HeleDanmark_DAWA.KVHx FROM Anvendelseskoder RIGHT JOIN HeleDanmark_DAWA ON Anven
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
这给了我以下输出:(新用户,无法发布图片,抱歉!)
我想要更像这样的东西:
我一直在检查这个问题,但我没法让它起作用。。有人能帮我吗
更新:
我试图使代码正常工作,但无法使其满足我的要求:
7月17日更新代码(我无法上班):
看起来您与上次的尝试非常接近,只需从查询末尾的from子句中删除别名
as s1
,您应该会得到您想要的结果,或者至少得到一个与显示为所需结果的图像相匹配的结果(除了一个小改动,但结果似乎与源数据不匹配)
但是,您的查询使用了几个相关的子查询,这些子查询可能效率不高,可以用大小写表达式替换,因此您的查询可以简化为以下内容(这将提供相同的输出):
如果可能的话,您有不同数量的列,那么您可能需要考虑使查询成为动态的。有几个很好的答案向您展示了如何使用,例如:发布您编写的无法使用的PIVOT代码。当然。。完全忘记了那部分,对不起!我现在添加了@EricHauenstein:)我尝试了不同的方法,因为它最多只有三个代码和描述。。在主邮报上称之为7月17日。。
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
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 AS Kode1, Byggeanvendelse AS Anvend1,
(SELECT Byggeanvendelseskode FROM aa AS s2
WHERE s2.Nr = 2 AND s2.KVHx = aa.KVHx) AS Kode2,
(SELECT Byggeanvendelse FROM aa AS s2
WHERE s2.Nr = 2
AND s2.KVHx = aa.KVHx) AS Anvend2,
(SELECT Byggeanvendelseskode FROM aa AS s2
WHERE s2.Nr = 3 AND s2.KVHx = aa.KVHx) AS Kode3,
(SELECT Byggeanvendelse FROM aa AS s2
WHERE s2.Nr = 3 AND s2.KVHx = aa.KVHx) AS Anvend3
FROM aa AS s1
WHERE Nr = 1
WITH cte AS (
SELECT DISTINCT
Anvendelseskoder.[Usage Code] AS [Byggeanvendelseskode],
Anvendelseskoder.[Usage Code Value] AS [Byggeanvendelse],
HeleDanmark_DAWA.KVHx,
Nr = ROW_NUMBER() OVER(PARTITION BY HeleDanmark_DAWA.KVHx
ORDER BY Anvendelseskoder.[Usage Code])
FROM Anvendelseskoder
RIGHT JOIN HeleDanmark_DAWA
ON Anvendelseskoder.KVHx = HeleDanmark_DAWA.KVHx
WHERE HeleDanmark_DAWA.postnr=6720 AND Anvendelseskoder.[Usage Code]>0
)
SELECT KVHx,
MAX(CASE WHEN Nr = 1 THEN Byggeanvendelseskode END) AS Kode1,
MAX(CASE WHEN Nr = 1 THEN Byggeanvendelse END) AS Anvend1,
MAX(CASE WHEN Nr = 2 THEN Byggeanvendelseskode END) AS Kode2,
MAX(CASE WHEN Nr = 2 THEN Byggeanvendelse END) AS Anvend2,
MAX(CASE WHEN Nr = 3 THEN Byggeanvendelseskode END) AS Kode3,
MAX(CASE WHEN Nr = 3 THEN Byggeanvendelse END) AS Anvend3
FROM cte
GROUP BY KVHx;