Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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
Sql 将值从两列透视到多列_Sql_Sql Server_Select_Pivot - Fatal编程技术网

Sql 将值从两列透视到多列

Sql 将值从两列透视到多列,sql,sql-server,select,pivot,Sql,Sql Server,Select,Pivot,表格:样本 ID Day Status MS ---------------------------- 1 1 0 10 1 2 0 20 1 3 1 15 2 3 1 3 2 30 0 5 2 31 0 6 预期结果: ID Day1 Day2 Day3

表格:样本

ID      Day    Status   MS
----------------------------
 1       1       0      10
 1       2       0      20
 1       3       1      15 
 2       3       1      3
 2       30      0      5
 2       31      0      6
预期结果:

 ID  Day1  Day2  Day3....Day30  Day31   Status1  Status2  Status3...Status30  Status31
 ---------------------------------------------------------------------------------------
 1    10    20    15      NULL   NULL      0        0        1           NULL     NULL   

 2    NULL  NULL  3        5      6        NULL     NULL     1            0         0   
ID  Day1  Day2  Day3....Day30  Day31
-------------------------------------
 1    10    20    15      NULL   NULL

 2    NULL  NULL  3        5      6   
SELECT 
     ID
    ,[1]     AS Day1
    ,[2]     AS Day2
    ,[3]     AS Day3
        .
        .
        .
    ,[30]    AS Day30
    ,[31]    AS Day31
FROM
(
    SELECT 
        ID
        ,[Day]
        ,MS
    FROM 
        Sample  
) AS A
PIVOT
(
    MIN(MS)
    FOR [Day] IN([1],[2],[3],...[30],[31]) 
) AS pvtTable
我想为每个ID获取每天从1到31的
MS和Status

我使用了
PIVOT
得到了以下结果

结果:

 ID  Day1  Day2  Day3....Day30  Day31   Status1  Status2  Status3...Status30  Status31
 ---------------------------------------------------------------------------------------
 1    10    20    15      NULL   NULL      0        0        1           NULL     NULL   

 2    NULL  NULL  3        5      6        NULL     NULL     1            0         0   
ID  Day1  Day2  Day3....Day30  Day31
-------------------------------------
 1    10    20    15      NULL   NULL

 2    NULL  NULL  3        5      6   
SELECT 
     ID
    ,[1]     AS Day1
    ,[2]     AS Day2
    ,[3]     AS Day3
        .
        .
        .
    ,[30]    AS Day30
    ,[31]    AS Day31
FROM
(
    SELECT 
        ID
        ,[Day]
        ,MS
    FROM 
        Sample  
) AS A
PIVOT
(
    MIN(MS)
    FOR [Day] IN([1],[2],[3],...[30],[31]) 
) AS pvtTable
查询:

 ID  Day1  Day2  Day3....Day30  Day31   Status1  Status2  Status3...Status30  Status31
 ---------------------------------------------------------------------------------------
 1    10    20    15      NULL   NULL      0        0        1           NULL     NULL   

 2    NULL  NULL  3        5      6        NULL     NULL     1            0         0   
ID  Day1  Day2  Day3....Day30  Day31
-------------------------------------
 1    10    20    15      NULL   NULL

 2    NULL  NULL  3        5      6   
SELECT 
     ID
    ,[1]     AS Day1
    ,[2]     AS Day2
    ,[3]     AS Day3
        .
        .
        .
    ,[30]    AS Day30
    ,[31]    AS Day31
FROM
(
    SELECT 
        ID
        ,[Day]
        ,MS
    FROM 
        Sample  
) AS A
PIVOT
(
    MIN(MS)
    FOR [Day] IN([1],[2],[3],...[30],[31]) 
) AS pvtTable

如何将状态列与结果合并?

试试这个。使用另一个
Pivot
转换状态列。然后在选择列列表中使用聚合(
Max
Min
)和分组依据
Id
,以获得结果

CREATE TABLE #est
  (ID INT,[Day] INT,[Status] INT,MS INT)

INSERT #est
VALUES (1,1,0,10),(1,2,0,20),(1,3,1,15 ),
       (2,3,1,3),(2,30,0,5),(2,31,0,6) 


SELECT ID,
       Max([Day1])    [Day1],
       Max([Day2])    [Day2],
       Max([Day3])    [Day3],
       Max([Day30])   [Day30],
       Max([Day31])   [Day31],
       Max([status1]) [status1],
       Max([status2]) [status2],
       Max([status3]) [status3],
       Max([status30])[status30],
       Max([status31])[status31]
FROM   (SELECT Id,
               'status' + CONVERT(VARCHAR(30), Day) col_stat,
               'Day' + CONVERT(VARCHAR(30), Day)    Col_Day,
               [status],
               ms
        FROM   #est) a
       PIVOT (Min([ms])
             FOR Col_Day IN([Day1],[Day2],[Day3],[Day30],[Day31])) piv 
       PIVOT (Min([status]) FOR col_stat IN ([status1],[status2],[status3],[status30],[status31])) piv1
GROUP BY id

简单地把你得到的结果作为一个表“T1”,用第二个选项,即状态“T2”来创建,然后加入IDI尝试你所说的。但是有没有可能用单支点来实现呢。