Сделать динамические столбцы в sql server 2014 при появлении повторяющихся значений

Я запускаю следующий 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

Это дает мне следующий вывод: (новый пользователь, не могу публиковать фотографии, извините!)

введите здесь описание изображения

И я хочу что-то еще вроде этого:

введите здесь описание изображения

Я проверял этот вопрос о использовании PIVOT и JOIN вместе, но я не могу т заставить его работать .. Может ли кто-нибудь помочь мне с этим?

Обновление: код, который я пытался заставить работать, но не могу заставить его делать то, что я хочу: введите описание изображения здесь

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

Обновление code17july (которое я не могу заставить работать):

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

person PKPX10    schedule 16.07.2015    source источник
comment
Опубликуйте написанный вами код PIVOT, который не работает.   -  person Eric Hauenstein    schedule 16.07.2015
comment
Конечно... совсем забыл эту часть, извините!   -  person PKPX10    schedule 16.07.2015
comment
Я добавил это сейчас @EricHauenstein :)   -  person PKPX10    schedule 16.07.2015
comment
Я пробовал другой подход, учитывая, что он будет иметь максимум три кода и описания. Назвал его code17july в основном посте..   -  person PKPX10    schedule 17.07.2015


Ответы (1)


Похоже, вы на самом деле довольно близки к своей последней попытке, просто удалите псевдоним as s1 из предложения from в конце запроса, и вы должны получить желаемый результат или, по крайней мере, результат, соответствующий изображению, которое вы показали как желаемый результат (за исключением одного незначительного изменения, но результат не соответствует исходным данным).

Но ваш запрос использует несколько коррелированных подзапросов, которые могут быть не такими эффективными и могут быть заменены выражениями case, и, таким образом, ваш запрос может быть сокращен до этого (что дает тот же результат):

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;

Если может случиться так, что у вас есть различное количество столбцов, вы можете захотеть сделать запрос динамическим. Есть несколько хороших ответов, которые показывают, как это сделать, например: строки в столбцы на сервере sql

person jpw    schedule 17.07.2015