SQL Server,将UNPIVOT限制为自动排序列。

3

我有一张表格,其中只有一行数据:

Account | OrderID   | OrderName          | Priority | Fasting   |AssignedTo       |ResultsTo    |Location
----------------------------------------------------------------------------------------------------------------------------
12345   | REQ123456 | Lipid Panel (1.2)  |Routine   | Yes       |Fast, Brook      |Nurse Group  |Fisher Rd, Woodbridge, NV

现在我想要对数据进行UNPIVOT,以以下形式向用户展示:
GROUPCOL    | LABEL       | VALUE
-------------------------------------------------
General     | Account     | 12345
General     | OrderID     | REQ123456
General     | OrderName   | Lipid Panel (1.2)
General     | Priority    | Routine    
General     | Fasting     | Yes        
Result      | ResultsTo   | Nurse Group
Result      | AssignedTo  | Fast, Brook
Result      | Location    | Fisher Rd, Woodbridge, NV

我正在努力寻找解决方案,以便默认情况下限制UNPIVOT按列排序。我想按照自己的方式对列进行排序。以下是查询:

SELECT  'General' GROUPCOL, LABEL, VALUE
FROM TESTPIVOT
UNPIVOT (
    VALUE FOR LABEL IN (Account, OrderID, OrderName, Priority, Fasting)
) AS UNPVT
UNION
SELECT  'Result' GROUPCOL, LABEL, VALUE
FROM TESTPIVOT
UNPIVOT (
    VALUE FOR LABEL IN (AssignedTo, ResultsTo, Location)
) AS UNPVT

输出结果如下:
GROUPCOL    | LABEL       | VALUE
-------------------------------------------------
General     | Account     | 12345
General     | Fasting     | Yes        
General     | OrderID     | REQ123456
General     | OrderName   | Lipid Panel (1.2)
General     | Priority    | Routine    
Result      | AssignedTo  | Fast, Brook
Result      | Location    | Fisher Rd, Woodbridge, NV 
Result      | ResultsTo   | Nurse Group

我觉得,如果在列中关联一个顺序列,那么就可以在最后按照需要对其进行排序(这样一来,我可以根据要求随时更改顺序)。


你正在使用哪个版本的SQL Server? - Taryn
我正在使用SQL Server 2008 R2。 - Sri Reddy
1个回答

6

如果您使用的是SQL Server 2008,那么您可以使用CROSS APPLYVALUES来UNPIVOT数据。使用这种方法可以创建一个用于排序的列:

select c.GroupCol, c.Label, c.Value
from testpivot
cross apply
(
  values
  ('General', 'Account', Account, 1),
  ('General', 'OrderID', OrderID, 2),
  ('General', 'OrderName', OrderName, 3),
  ('General', 'Priority', Priority, 4),
  ('General', 'Fasting', Fasting, 5),
  ('Result', 'ResultsTo', ResultsTo, 6),
  ('Result', 'AssignedTo', AssignedTo, 7),
  ('Result', 'Location', Location, 8)
) c (GroupCol, Label, Value, SortOrder)
order by sortorder;

请见带有演示的SQL Fiddle

这是一个很棒的解决方案。我之前不知道CROSS APPLY的多功能性。这似乎是一种更好的解决方案,可以明确指定排序顺序。我觉得除非我想让用户有更改排序顺序的能力,否则我甚至不需要排序列。太棒了! - Sri Reddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接