Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 需要Pivot/DynamicSQL帮助_Tsql_Pivot_Dynamic Sql - Fatal编程技术网

Tsql 需要Pivot/DynamicSQL帮助

Tsql 需要Pivot/DynamicSQL帮助,tsql,pivot,dynamic-sql,Tsql,Pivot,Dynamic Sql,我需要转换以下数据(为此目的简化):- 为此:- ID Thing1 Thing2 Thing3 Thing4 ============================================== 12345 Data1 Data2 Data3 Data4 23456 Data5 Data6 Data7 Data8 基本上需要按ID分组,然后对于每个“东西”,我需要一列。由于本例的优点,表中的“Thin

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

为此:-

ID      Thing1    Thing2    Thing3    Thing4
==============================================
12345   Data1     Data2     Data3     Data4
23456   Data5     Data6     Data7     Data8
基本上需要按ID分组,然后对于每个“东西”,我需要一列。由于本例的优点,表中的“Things”数始终相同,因此列数不会发生变化。我不能在这个阶段改变起始表的结构,所以不幸的是解决方案不能重新考虑表的设计

我曾经考虑过使用PIVOT来解决这个问题,但由于我没有聚合数据,所以我真的陷入了困境

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


提前感谢

如果您只想拥有相同的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
列旋转,并在四个输出列中获取每个
对象的
数据值。你想得太多了。这样想,如果在只有一行的情况下应用MAX(),它将只返回那一行(或者可以使用MIN,因为它仍然只是聚合一行)。您的pivot语句应该类似于:([Thing1]、[Thing2]、[Thing3]、[Thing4])中DataTitle的pivot(MAX(DataValue))因为pvt将其动态化非常简单。这里有很多这样的例子,在网上也有
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