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


124

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

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

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

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

使用PIVOT功能甚至可能吗?



看一下此链接:dotnetgalactics.wordpress.com/2009/10/23/…可能会有帮助;)
Pato

如果不同项目的数量未知,则可以看到此链接,这意味着透视后的列数是动态的。SQL Server Pivot:使用动态查询将行转换为列
maeenul 2011年

Answers:


164

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

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杜德(Dude)...您真是个天才。我希望我早点知道这一点,而不必学习如何PIVOT!
ashes999 2012年

@ Silmaril89假设所讨论的第二列名称为“数据”,第一
列为

1
我为什么不应该使用...ELSE NULL END...代替...ELSE '' END...
莫。

15
这个或PIVOT哪个更快?
罗伯特·耶普森

哇,你真让我震惊。在我的脑海中,我有了一个想法,尽管我认为SQL Server应该“做个秘密!”,但我认为无法完成。然后,我看到了。
大卫·海伊

54

表格设定:

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

你的桌子

不使用PIVOT进行查询:

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查询:

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

这两个查询的结果:
在此处输入图片说明


感谢您提供这个罕见而清晰的答案。它立即显示了一个示例和所得的数据集
real_yggdrasil 2014年

我知道这很旧,但是这是我所见过的最清晰,插图最好的枢轴演示。
Stan Shaw

52

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

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


6

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

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


0

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

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.