129

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

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

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

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

这甚至可以通过 PIVOT 功能实现吗?

4

7 回答 7

167

请记住,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
于 2008-09-02T19:55:19.270 回答
55

表设置:

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

两个查询结果:
在此处输入图像描述

于 2012-06-01T20:53:00.900 回答
53

如果您特别想使用 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
于 2008-09-02T20:52:47.977 回答
7

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

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
于 2011-08-27T09:12:46.653 回答
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
于 2008-08-23T19:44:24.117 回答
5
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;
于 2013-12-19T17:57:43.360 回答
0

我有一种情况,我正在解析字符串,而相关字符串的前两个位置将是医疗保健索赔编码标准的字段名称。所以我会去掉字符串并获取 F4、UR 和 UQ 或诸如此类的值。对于一个用户来说,这对一个记录或几条记录来说非常棒。但是当我想查看数百条记录和所有用户的值时,它需要成为 PIVOT。这对于将大量记录导出到 Excel 来说非常棒。我收到的具体报告请求是“每次有人提交 Benadryl 索赔时,他们在 F4、UR 和 UQ 字段中提交的值是多少。我有一个 OUTER APPLY,它创建了 ColTitle 和下面的值字段

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )
于 2019-02-28T03:44:26.170 回答