Join 出现重复值时,在sql server 2014中创建动态列

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

我正在运行以下sql:

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;