【问题标题】:MSSQL: Transpose-Pivot table without aggregate functionMSSQL:没有聚合函数的转置数据透视表
【发布时间】:2019-05-06 08:58:31
【问题描述】:

我需要一些有关 MS SQL Transpose 的帮助。我尝试了许多枢轴代码,但它们对我的数据没有帮助。 这是我的数据。 enter image description here

我想在没有聚合的情况下转移(旋转)它。数据应该是这样的,

enter image description here

我尝试了以下代码;

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

但它得到了,

enter image description here

这不是我想要的数据。大部分价值都消失了

如果我不使用 aggrate (max-min.. etc),则代码不起作用。

请帮忙

【问题讨论】:

  • “我想在没有聚合的情况下转移(pivot)它” 不太可能,因为 SQL Server PIVOT 仍然需要某种非聚合函数。
  • 使用聚合函数数据不成立。结果只有一行数据
  • 您应该提供带有示例数据和预期结果(无图像)的创建表结构......因为两个人在解决这个问题方面做出了非常好的教育
  • 我没有在这个页面中显示我的表格。这就是我导入图片的原因。 @Raymond Nijland

标签: sql sql-server pivot aggregate transpose


【解决方案1】:

使用条件聚合

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

【讨论】:

  • 我会在一周中的某个时间选择这个 anny 而不是 SQL Server PIVOT,因为这样读起来更容易,语法更容易使用,而且它可以在大多数 RDBMS 系统之间移植,所以 +1
  • @RaymondNijland 。 . .这不会产生预期的结果——所以我对赞成票感到困惑。显然,由于GROUP BY,每一行中只有一个列可以具有非NULL 值。
  • 1000_TekirdagTM 10000_TekirdagOB1 10100_YagliDM H15_31_50_KUBLAJ NULL NULL NULL H12_KOMPANZASYON ÇiKiŞi NULL NULL NULL H04_T10 此代码不起作用。结果如上。它只获取一行数据。
  • @GordonLinoff 这种方法通常是一种非常合理的数据透视方法,为了获得更好的答案,topicstarter 应该使用创建表结构和示例数据以及预期结果来更新问题
  • @RaymondNijland 。 . .我会让你运行它,这样你就可以看到它到底做了什么。我强烈建议您这样做。
【解决方案2】:

首先,您可以使用聚合,如下所示:

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 分米。所以很难一一写完。有没有办法动态地做这个支点?第一个代码不起作用。一行数据来了。
【解决方案3】:

但我有 652 分米。所以很难一一写完

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2019-03-03
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多