MSSQL:不使用聚合函数转置-透视表

3
我需要关于 MS SQL 转置的帮助。我尝试了许多透视代码,但它们对我的数据没有帮助。这是我的数据。 点击此处查看图片描述 我想要不聚合(pivot)数据变成下面这样, 点击此处查看图片描述 我尝试了以下代码;
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

但它得到的是:

在这里输入图像描述

这不是我想要的数据。大多数值已经失去了。

如果我不使用聚合(max-min..等),代码就无法工作。

请帮助。


1
“我想要转置(透视)它,但不需要聚合函数”并不现实,因为SQL Server PIVOT仍需要某种聚合函数。 - Raymond Nijland
使用聚合函数时,数据不会被正确返回。结果只有一行数据。 - Nermin D.
你应该提供带有示例数据和预期结果的创建表结构(不包括图片),因为有两个人对解决这个问题做出了非常明智的猜测。 - Raymond Nijland
我在这个页面中没有展示我的表格,所以我导入了图片。@Raymond Nijland - Nermin D.
3个回答

6
使用条件聚合
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

2
我会选择这个Anny在一周的任何时间,而不是SQL Server PIVOT,因为它更易读,语法更易于使用,并且可以在大多数RDBMS系统之间移植,所以+1。 - Raymond Nijland
@RaymondNijland . . . 这并没有产生期望的结果 - 所以我对点赞感到困惑。显然,由于GROUP BY,每行只能有一个列具有非NULL值。 - Gordon Linoff
1000_TekirdagTM 10000_TekirdagOB1 10100_YagliDM H15_31_50_KUBLAJ NULL NULL NULL H12_KOMPANZASYON ÇiKiŞi NULL NULL NULL H04_T10
这段代码不能正常工作。结果如上面所示。它只获取一行数据。
- Nermin D.
1
@GordonLinoff 这种方法通常是一个很好的透视方法,为了得到更好的答案,主题发起者应该更新问题,提供创建表结构、示例数据和预期结果。 - Raymond Nijland
@RaymondNijland……我会让你运行它,这样你就可以看到它的真正作用。我强烈鼓励你这样做。 - Gordon Linoff
我很想帮忙,@GordenLinoff,但我正在度假,而且我怀疑SQL Server能否在iPhone上运行。 - Raymond Nijland

0

首先,您可以使用聚合函数,像这样:

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';

但是我有652个数据。所以一个一个地写所有的数据很困难。有没有一种动态的方法来进行这个透视表呢?第一段代码不起作用,只有一行数据出现了。 - Nermin D.

0

但我有652个数据模块,所以逐一写入非常困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接