此数据集是否可能使用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的连续数字列表。你可以在这里读到这项技术。谢谢你的帮助谢谢你的帮助