MSSQL: таблица Transpose-Pivot без агрегатной функции - PullRequest
3 голосов
/ 06 мая 2019

Мне нужна помощь по MS SQL Transpose.Я пробовал много сводных кодов, но они не помогли с моими данными.Это мои данные. введите описание изображения здесь

Я хочу провести (развернуть) его без агрегата.Данные должны быть такими:

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

Я попробовал следующий код:

SELECT * 
FROM (
        SELECT
        dm
        ,max(hucre) as mxhucre
        FROM #dene
        group by dm 
        ) as pTablom
PIVOT
(
        max(mxhucre)
        FOR dm IN (
        [1000_TEKİRDAĞ TM]
        ,[10000_TEKIRDAG OB1]
        ,[10100_YAĞCI DM]
))AS Pvt

но он получает,

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

это не те данные, которые я хочу.Большая часть значений ушла

Если я не использую аггрейт (макс-мин .. и т. Д.), Код не работает.

Пожалуйста, помогите

Ответы [ 3 ]

6 голосов
/ 06 мая 2019

использовать условное агрегирование

SELECT 
    max(case when dm='1000_TEKİRDAĞ TM' then hucre end) as '1000_TEKİRDAĞ TM'
    max(case when dm='10000_TEKIRDAG OB1'then hucre end) as '10000_TEKIRDAG OB1',
    max(case when dm='10100_YAĞCI DM  H04_T10' then hucre end) as '10100_YAĞCI DM  H04_T10'
FROM #dene
group by dm
0 голосов
/ 07 мая 2019

Но у меня 652 дм. Так что трудно написать все это один за другим

0 голосов
/ 06 мая 2019

Во-первых, вы можете использовать агрегирование, например так:

with t as (
      select t.*,
             row_number() over (partition by dm order by (select null)) as seqnum
      from <your table> t
     )
select max(case when dm = '1000_TEKİRDAĞ TM' then hucre end) as [1000_TEKİRDAĞ TM],
       max(case when dm = '10000_TEKIRDAG OB1' then hucre end) as [10000_TEKIRDAG OB1]
       max(case when dm = '10100_YAĞCI DM  H01_T10' then hucre end) as [10100_YAĞCI DM  H01_T10]
from t
group by seqnum;

Вы можете сделать это без агрегирования, используя объединения:

with t as (
      select t.*,
             row_number() over (partition by dm order by (select null)) as seqnum
      from <your table> t
     )
select t1.hucre, t2.hucre, t3.hucre
from t t1 left join
     t t2
     on t2.seqnum = t1.seqnum
        t2.dm = '10000_TEKIRDAG OB1' left join
     t t3
     on t3.seqnum = t1.seqnum
        t3.dm = '10100_YAĞCI DM  H01_T10' left join
where t1.dm = '1000_TEKİRDAĞ TM';
...