【问题标题】:Pivot/dynamic SQL help required [duplicate]需要透视/动态 SQL 帮助 [重复]
【发布时间】:2015-09-17 06:01:17
【问题描述】:

我需要转换以下数据(为 SO 目的而简化):-

DataTitle   DataValue   Id
==============================
Thing 1     Data 1      12345
Thing 2     Data 2      12345
Thing 3     Data 3      12345
Thing 4     Data 4      12345
Thing 1     Data 5      23456
Thing 2     Data 6      23456
Thing 3     Data 7      23456
Thing 4     Data 8      23456

进入这个:-

ID      Thing1    Thing2    Thing3    Thing4
==============================================
12345   Data1     Data2     Data3     Data4
23456   Data5     Data6     Data7     Data8

基本上需要按 ID 分组,然后对于每个“事物”我都需要一列。为了这个例子的好处,表中总是有相同数量的“事物”,所以列的数量不会改变。在这个阶段我不能改变起始表结构,所以不幸的是解决方案不能重新考虑表设计......

我已经研究过使用 PIVOT 来解决这个问题,但由于我没有汇总数据,所以我真的卡住了..

PIVOT 命令是否有一些语法可以帮助我实现这一点,或者我需要一些更动态的东西。

提前致谢

【问题讨论】:

  • 您正在寻找的只是一个动态支点。你在考虑聚合部分。这样想,如果你在只有 1 行时应用 MAX(),它只会返回 1 行(或者你可以使用 MIN,因为它仍然只是聚合 1 行)。您的数据透视语句应类似于:PIVOT (MAX(DataValue) FOR DataTitle IN([Thing 1],[Thing 2],[Thing 3],[Thing 4])) AS pvt跨度>
  • 从那里开始动态化很简单。这里有很多关于 SO 和一般 Web 的示例

标签: tsql pivot dynamic-sql


【解决方案1】:

如果您只想拥有相同的 4 样东西,您可以使用这样的查询来生成输出:

CREATE TABLE #DemoTable (DataTitle VARCHAR(10), DataValue VARCHAR(10), Id INT)

INSERT INTO #DemoTable (DataTitle, DataValue, Id) VALUES ('Thing 1', 'Data 1', '12345'),('Thing 2', 'Data 2', '12345'),('Thing 3', 'Data 3', '12345'),('Thing 4', 'Data 4', '12345'),('Thing 1', 'Data 5', '23456'),('Thing 2', 'Data 6', '23456'),('Thing 3', 'Data 7', '23456'),('Thing 4', 'Data 8', '23456')

SELECT  DISTINCT
        dt.Id,
        dt1.DataValue AS Thing1,
        dt2.DataValue AS Thing2,
        dt3.DataValue AS Thing3,
        dt4.DataValue AS Thing4
  FROM  #DemoTable dt
    INNER JOIN #DemoTable dt1 ON dt1.Id = dt.Id AND dt1.DataTitle = 'Thing 1'
    INNER JOIN #DemoTable dt2 ON dt2.Id = dt.Id AND dt2.DataTitle = 'Thing 2'
    INNER JOIN #DemoTable dt3 ON dt3.Id = dt.Id AND dt3.DataTitle = 'Thing 3'
    INNER JOIN #DemoTable dt4 ON dt4.Id = dt.Id AND dt4.DataTitle = 'Thing 4'

DROP TABLE #DemoTable

这实际上以您的 Id 列为中心,并在四个输出列中为每个 thing 获取 DataValue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2020-12-12
    • 1970-01-01
    • 2012-09-26
    相关资源
    最近更新 更多