关于tsql:SQL Server:PIVOTing字符串数据的示例

SQL Server: Examples of PIVOTing String data

试图找到一些简单的SQL Server PIVOT示例。 我发现的大多数示例都涉及对数字进行计数或求和。 我只想透视一些字符串数据。 例如,我有一个查询,返回以下内容。

1
2
3
4
5
Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT

我想使用PIVOT(如果可能的话)使结果如下所示:

1
2
3
Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT

使用PIVOT功能是否有可能?


请记住,MAX聚合函数将同时适用于文本和数字。此查询将只需要扫描表一次。

1
2
3
4
5
SELECT Action,
       MAX( CASE data WHEN 'View' THEN data ELSE '' END ) ViewCol,
       MAX( CASE data WHEN 'Edit' THEN data ELSE '' END ) EditCol
 FROM t
 GROUP BY Action

表格设定:

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE dbo.tbl (
    action VARCHAR(20) NOT NULL,
    view_edit VARCHAR(20) NOT NULL
);

INSERT INTO dbo.tbl (action, view_edit)
VALUES ('Action1', 'VIEW'),
       ('Action1', 'EDIT'),
       ('Action2', 'VIEW'),
       ('Action3', 'VIEW'),
       ('Action3', 'EDIT');

您的桌子:
SELECT action, view_edit FROM dbo.tbl

Your table

不使用PIVOT进行查询:

1
2
3
4
5
SELECT Action,
[View] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'VIEW'),
[Edit] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'EDIT')
FROM tbl t
GROUP BY Action

使用PIVOT查询:

1
2
3
SELECT [Action], [View], [Edit] FROM
(SELECT [Action], view_edit FROM tbl) AS t1
PIVOT (MAX(view_edit) FOR view_edit IN ([View], [Edit]) ) AS t2

这两个查询的结果:
enter image description here


如果您特别想使用SQL Server PIVOT函数,那么这应该起作用,假定您的两个原始列分别称为act和cmd。 (虽然看起来不太漂亮。)

1
2
3
4
5
6
7
SELECT act AS 'Action', [View] as 'View', [Edit] as 'Edit'
FROM (
    SELECT act, cmd FROM data
) AS src
PIVOT (
    MAX(cmd) FOR cmd IN ([View], [Edit])
) AS pvt

从http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/:

1
2
3
4
5
6
7
8
SELECT CUST, PRODUCT, QTY
FROM Product) up
PIVOT
( SUM(QTY) FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)) AS pvt) p
UNPIVOT
(QTY FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)
) AS Unpvt
GO

好吧,对于您的示例以及任何数量有限的唯一列,都应该这样做。

1
2
3
4
5
select
    distinct a,
    (select distinct t2.b  from t t2  where t1.a=t2.a and t2.b='VIEW'),
    (select distinct t2.b from t t2  where t1.a=t2.a and t2.b='EDIT')
from t t1

1
2
3
4
5
6
7
8
9
10
With pivot_data as
(
select
action, -- grouping column
view_edit -- spreading column
from tbl
)
select action, [view], [edit]
from   pivot_data
pivot  ( max(view_edit) for view_edit in ([view], [edit]) ) as p;


我遇到一种情况,我正在解析字符串,并且该字符串的前两个位置将是医疗保健索赔编码标准的字段名称。因此,我将删除字符串并获取F4,UR和UQ或其他值。对于一个用户来说,一个记录或几个记录就很棒。但是,当我想查看数百条记录和所有用户的值时,它必须是PIVOT。特别是对于导出大量记录以达到卓越效果而言,这真是太好了。我收到的特定报告请求是"每次有人向Benadryl提出索赔时,他们在F4,UR和UQ字段中提交了什么值。我有一个外部应用程序,该应用程序创建了ColTitle,下面的值字段

1
2
3
4
PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )

推荐阅读