使用Pivot的SQL查询

使用Pivot的SQL查询,sql,sql-server,sql-server-2005,sql-server-2008,Sql,Sql Server,Sql Server 2005,Sql Server 2008,我的表格如下: PriorityText Priority LoRes Partial Unknown N_A HiRes ------------------------------------------------------------------ Very High 5 0.0612 0.0000 0.0612 0.0612 0.2041 High 4 0.1429 0.0000 0.1

我的表格如下:

PriorityText  Priority  LoRes   Partial  Unknown  N_A      HiRes
------------------------------------------------------------------
Very High     5         0.0612  0.0000   0.0612   0.0612   0.2041
High          4         0.1429  0.0000   0.1633   0.0000   0.1633
Medium        3         0.0000  0.0000   0.1020   0.0000   0.0408
Low-Medium    2         0.0000  0.0000   0.0000   0.0000   0.0000
Low           1         0.0000  0.0000   0.0000   0.0000   0.0000
Priority PriorityText   LoRes   Partial  Unknown   N_A    HiRes
1        VeryHigh       0.05    11       54        0      9
2        High           0.14    22       54        0      3
3        Medium         0.07    33       65        0      7
4        Low-Medium     0.01    44       87        0      4
5        Low            0       55       9         0      0
NULL     NULL           NULL    NULL     NULL      NULL   NULL
我想把表格换成这样:

PriorityText  Low  Low-Medium  Medium  High    Very High
--------------------------------------------------------
Priority      1    2           3       4       5
LoRes         0    0           0       0.1429  0.0612
Partial       0    0           0       0       0
Unknown       0    0           0.102   0.1633  0.0612
N_A           0    0           0       0       0.0612
HiRes         0    0           0.0408  0.1633  0.2041
我正在使用SQL2008。我很难想出SQL语法来执行数据透视

有人能分享一个SQL代码片段来帮我解决这个问题吗

我已经使用以下方法成功地透视了一行,但我不知道如何使它完成我所有的行

SELECT VeryHigh AS VeryHigh, 
       High AS High, 
       Medium AS Medium, 
       [Low-Medium] AS [Low-Medium], 
       Low AS Low
 FROM  (SELECT [PriorityText], [LoRes] FROM @tbTemp) p
PIVOT (SUM(LoRes) FOR [PriorityText] in ([VeryHigh], [High], [Medium], [Low-Medium], [Low])) pvt
我表中的测试数据如下:

PriorityText  Priority  LoRes   Partial  Unknown  N_A      HiRes
------------------------------------------------------------------
Very High     5         0.0612  0.0000   0.0612   0.0612   0.2041
High          4         0.1429  0.0000   0.1633   0.0000   0.1633
Medium        3         0.0000  0.0000   0.1020   0.0000   0.0408
Low-Medium    2         0.0000  0.0000   0.0000   0.0000   0.0000
Low           1         0.0000  0.0000   0.0000   0.0000   0.0000
Priority PriorityText   LoRes   Partial  Unknown   N_A    HiRes
1        VeryHigh       0.05    11       54        0      9
2        High           0.14    22       54        0      3
3        Medium         0.07    33       65        0      7
4        Low-Medium     0.01    44       87        0      4
5        Low            0       55       9         0      0
NULL     NULL           NULL    NULL     NULL      NULL   NULL

谢谢你的帮助

不确定如何进行硬编码,但您要做的是将行与列转置

SELECT p.[Type] as 'PriorityText', Low, [Low-Medium], Medium,High,[VeryHigh]
FROM (SELECT PriorityText, [Holder],[Type]
      FROM (SELECT PriorityText,Priority,LoRes,[Partial],Unknown,N_A,HiRes
              FROM Test) as sq_source
      UNPIVOT ([Holder] FOR [Type] IN
        (Priority,LoRes,[Partial],Unknown,N_A,HiRes)) as sq_up
     ) as sq 
 PIVOT (
    MIN([Holder])
    FOR PriorityText IN
       (VeryHigh,High,Medium,[Low-Medium],Low)
       ) as p
    order by CASE p.[Type] WHEN 'Priority' THEN 1
    WHEN 'LoRes' THEN 2
    WHEN 'Partial' THEN 3
    WHEN 'Unknown' THEN 4
    WHEN 'N_A' THEN 5
    ELSE 6 END ASC;
这应该能满足你的需要。需要注意的一点是,这仅在以下列中有效:

  • 优先权
  • 传说
  • 局部的
  • 不为人知
  • 努阿
  • 雇用

都是相同的数据类型(在我的测试中是十进制(5,4))。如果您的结果不同,则需要进行初始选择,并将其转换为通用数据类型,并将其用作sq_源。

对于我来说,预期结果中的优先级行在DB设计方面没有意义。它与其他行的类型不同,因此它不属于同一个数据集。我接受了您的查询并用我的表名替换了“Test”,我得到了如下错误:“Msg 8167,Level 16,State 1,Line 7列“LoRes”的类型与UNPIVOT列表中指定的其他列的类型冲突。”我还需要做其他事情吗?我在底部提到,[Priority]、[LoRes]、[Partial]、[Unknown]、[N_A]和[HiRes]列需要是相同的数据类型。e、 g.如果除知识外,你所有的知识都是十进制(5,4),那么你需要将知识转换为十进制(5,4)。如果您发送表的创建脚本,我将能够修改sql以满足您的需要。