SQL Server,限制UNPIVOT自动排序列

Sri*_*ddy 3 sql-server pivot unpivot sql-server-2008-r2

我有一个表格,其中包含一行数据:

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

现在,我希望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
Run Code Online (Sandbox Code Playgroud)

我很难找到限制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
Run Code Online (Sandbox Code Playgroud)

输出是:

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
Run Code Online (Sandbox Code Playgroud)

我想,如果不知何故我有一个与列关联的订单列,那么我可以根据需要在最后订购它(这样,我可以根据要求更改订单).

Tar*_*ryn 6

由于您使用的是SQL Server 2008,因此您可以使用CROSS APPLYVALUESUNPIVOT数据.使用此选项将允许您为排序顺序创建列:

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;
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo