此数据集是否可能使用SQL Pivot?

此数据集是否可能使用SQL Pivot?,sql,sql-server,tsql,pivot,Sql,Sql Server,Tsql,Pivot,我试图写一个查询,我需要一些帮助 我有一些数据如下所示: 但是,最终用户需要一个轴,以便数据显示如下: 我写了这段代码: SELECT * FROM ( SELECT TOP 100 Log0.sn ,CONVERT(VARCHAR(50), Log0.capture_time) AS Instant ,CONVERT(VARCHAR(50),Log0.address) + '/' + Log0.[Key] AS 'Address/Key' ,Log0.average AS Command ,

我试图写一个查询,我需要一些帮助

我有一些数据如下所示:

但是,最终用户需要一个轴,以便数据显示如下:

我写了这段代码:

SELECT *
FROM
(
SELECT TOP 100 
Log0.sn
,CONVERT(VARCHAR(50), Log0.capture_time) AS Instant
,CONVERT(VARCHAR(50),Log0.address) + '/' + Log0.[Key] AS 'Address/Key'
,Log0.average AS Command
,Log1.average AS Actual

FROM ih3_fan_speed_log_0 Log0
LEFT JOIN ih3_fan_speed_log_01 Log1 ON Log0.sn = Log1.sn AND 
Log0.capture_time = Log1.capture_time AND Log0.address = Log1.address

WHERE Log0.sn = 'V300188' AND Log0.capture_time = '03/26/2017 13:05:00'
) Src

pivot
(
  MAX(sn)
  for Instant in ([1], [2], [3], [4])
) piv;
但结果是:

我的问题是:

1为什么我的枢轴不能工作? 2甚至可以用枢轴做我需要的事情吗

谢谢你的帮助

根据请求,以下是数据:

sn  Instant Address/Key Command Actual
V300188     Mar 26 2017  1:05PM 1/EF-1  99.23   99.24
V300188     Mar 26 2017  1:05PM 2/EF-2  99.02   99.04
V300188     Mar 26 2017  1:05PM 3/EF-3  100 0
V300188     Mar 26 2017  1:05PM 4/EF-4  100 100
V300188     Mar 26 2017  1:05PM 41/MUA-1    74.58   74.58
V300188     Mar 26 2017  1:05PM 51/0-10VDC  74.58   74.58
以下是结果集:

Address/Key Command Actual  1   2   3   4
1/EF-1  99.23   99.24   NULL    NULL    NULL    NULL
2/EF-2  99.02   99.04   NULL    NULL    NULL    NULL
3/EF-3  100 0   NULL    NULL    NULL    NULL
4/EF-4  100 100 NULL    NULL    NULL    NULL
41/MUA-1    74.58   74.58   NULL    NULL    NULL    NULL
51/0-10VDC  74.58   74.58   NULL    NULL    NULL    NULL

下面是如何利用动态交叉表来完成这类工作。Jeff Moden在这里有一篇精彩的文章解释了这项技术


下面是如何利用动态交叉表来完成这类工作。Jeff Moden在这里有一篇精彩的文章解释了这项技术


动态轴的另一个选项

扭曲是最终结果中不明显/重复的列。如您所见,通过简单的替换x3解决了这一问题

Declare @SQL varchar(max) = Stuff((Select Distinct ','+QuoteName(concat('A',ColGrp)) 
                                                  +','+QuoteName(concat('B',ColGrp)) 
                                                  +','+QuoteName(concat('C',ColGrp)) 
                                    From (Select Distinct ColGrp=Row_Number() over (Partition By sn,Instant Order by [Address/Key]) From YourTable ) A  
                                    Order By 1 
                                    For XML Path('')),1,1,'') 

Select  @SQL = '
Select [SN],[Instant],' + replace(replace(replace(@SQL,'[A','[Address/Key]=[A'),'[C','[Actual]=[C'),'[B','[Command]=[B') + '
From (
        Select [SN]
              ,[Instant]
              ,[Col]     = Concat(B.Prefix,RN  )
              ,B.Value
        From (Select *,RN=Row_Number() over (Partition By sn,Instant Order by [Address/Key]) From YourTable) A
        Cross Apply (values (''A'',[Address/Key])
                            ,(''B'',cast(Command as varchar(25)))
                            ,(''C'',cast(Actual as varchar(25)))
                    ) B (PreFix,Value)
     ) A
 Pivot (max([Value]) For [Col] in (' + @SQL + ') ) p'
--Print @SQL
Exec(@SQL);
返回

编辑-如果有助于可视化

生成的SQL如下所示

Select [SN],[Instant],[Address/Key]=[A1],[Command]=[B1],[Actual]=[C1],[Address/Key]=[A2],[Command]=[B2],[Actual]=[C2],[Address/Key]=[A3],[Command]=[B3],[Actual]=[C3],[Address/Key]=[A4],[Command]=[B4],[Actual]=[C4],[Address/Key]=[A5],[Command]=[B5],[Actual]=[C5],[Address/Key]=[A6],[Command]=[B6],[Actual]=[C6]
From (
        Select [SN]
              ,[Instant]
              ,[Col]     = Concat(B.Prefix,RN  )
              ,B.Value
        From (Select *,RN=Row_Number() over (Partition By sn,Instant Order by [Address/Key]) From YourTable) A
        Cross Apply (values ('A',[Address/Key])
                           ,('B',cast(Command as varchar(25)))
                           ,('C',cast(Actual as varchar(25)))
                    ) B (PreFix,Value)
     ) A
 Pivot (max([Value]) For [Col] in ([A1],[B1],[C1],[A2],[B2],[C2],[A3],[B3],[C3],[A4],[B4],[C4],[A5],[B5],[C5],[A6],[B6],[C6]) ) p

动态轴的另一个选项

扭曲是最终结果中不明显/重复的列。如您所见,通过简单的替换x3解决了这一问题

Declare @SQL varchar(max) = Stuff((Select Distinct ','+QuoteName(concat('A',ColGrp)) 
                                                  +','+QuoteName(concat('B',ColGrp)) 
                                                  +','+QuoteName(concat('C',ColGrp)) 
                                    From (Select Distinct ColGrp=Row_Number() over (Partition By sn,Instant Order by [Address/Key]) From YourTable ) A  
                                    Order By 1 
                                    For XML Path('')),1,1,'') 

Select  @SQL = '
Select [SN],[Instant],' + replace(replace(replace(@SQL,'[A','[Address/Key]=[A'),'[C','[Actual]=[C'),'[B','[Command]=[B') + '
From (
        Select [SN]
              ,[Instant]
              ,[Col]     = Concat(B.Prefix,RN  )
              ,B.Value
        From (Select *,RN=Row_Number() over (Partition By sn,Instant Order by [Address/Key]) From YourTable) A
        Cross Apply (values (''A'',[Address/Key])
                            ,(''B'',cast(Command as varchar(25)))
                            ,(''C'',cast(Actual as varchar(25)))
                    ) B (PreFix,Value)
     ) A
 Pivot (max([Value]) For [Col] in (' + @SQL + ') ) p'
--Print @SQL
Exec(@SQL);
返回

编辑-如果有助于可视化

生成的SQL如下所示

Select [SN],[Instant],[Address/Key]=[A1],[Command]=[B1],[Actual]=[C1],[Address/Key]=[A2],[Command]=[B2],[Actual]=[C2],[Address/Key]=[A3],[Command]=[B3],[Actual]=[C3],[Address/Key]=[A4],[Command]=[B4],[Actual]=[C4],[Address/Key]=[A5],[Command]=[B5],[Actual]=[C5],[Address/Key]=[A6],[Command]=[B6],[Actual]=[C6]
From (
        Select [SN]
              ,[Instant]
              ,[Col]     = Concat(B.Prefix,RN  )
              ,B.Value
        From (Select *,RN=Row_Number() over (Partition By sn,Instant Order by [Address/Key]) From YourTable) A
        Cross Apply (values ('A',[Address/Key])
                           ,('B',cast(Command as varchar(25)))
                           ,('C',cast(Actual as varchar(25)))
                    ) B (PreFix,Value)
     ) A
 Pivot (max([Value]) For [Col] in ([A1],[B1],[C1],[A2],[B2],[C2],[A3],[B3],[C3],[A4],[B4],[C4],[A5],[B5],[C5],[A6],[B6],[C6]) ) p


添加示例数据并生成文本formattable而不是图像。以下是数据:@user3511334您知道地址/键可以有多少种组合吗?为未知数量的列编写数据透视是一件乏味的事情,但是如果您知道数据透视的列数永远不会超过4列,例如,它可以使工作更轻松。每个唯一的序列号是否有固定数量的记录?如果没有,是否有一个固定的上限?这里需要的是一个动态交叉表。添加示例数据并生成文本formattable而不是图像。以下是数据:@user3511334您知道地址/键可以有多少种组合吗?为未知数量的列编写数据透视是一件乏味的事情,但是如果您知道数据透视的列数永远不会超过4列,例如,它可以使工作更轻松。每个唯一的序列号是否有固定数量的记录?如果没有,是否有一个固定的上限?这里需要的是一个动态交叉表。哎呀!!这是可行的,但我还不完全明白。我会稍微研究一下,我可能会带着一些问题回来。是的,这有点复杂,直到你明白发生了什么。如果您需要,我很乐意解释其中的部分内容该注释部分似乎不允许回车,但我不理解这一点:将E1N作为值1,1,1,1,1,1,1,1,1dtn中的select 1,将E2N作为E1 a、E1 b中的select 1,-10E+2或100行E4N作为E2 a、E2 b中的select 1,-10E+4或10000行最大cteTallyN作为选择行数超过顺序,通过从E4中选择NULL,整个CTE列表是一个计数表或数字表。我实际上在我的系统中有一个视图,但在这里内联了它。它只是生成一个从1到10000的连续数字列表。你可以在这里读到这项技术。哎呀!!这是可行的,但我还不完全明白。我会稍微研究一下,我可能会带着一些问题回来。是的,这有点复杂,直到你明白发生了什么。如果您需要,我很乐意解释其中的部分内容该注释部分似乎不允许回车,但我不理解这一点:将E1N作为值1,1,1,1,1,1,1,1,1dtn中的select 1,将E2N作为E1 a、E1 b中的select 1,-10E+2或100行E4N作为E2 a、E2 b中的select 1,-10E+4或10000行最大cteTallyN作为选择行数超过顺序,通过从E4中选择NULL,整个CTE列表是一个计数表或数字表。我实际上在我的系统中有一个视图,但在这里内联了它。它只是生成一个从1到10000的连续数字列表。你可以在这里读到这项技术。谢谢你的帮助谢谢你的帮助