SQLServer: 透视字符串数据的示例

试图找到一些简单的 SQLServerPIVOT 示例。我发现的大多数例子都涉及到计数或总结数字。我只是想转换一些字符串数据。例如,我有一个返回以下内容的查询。

Action1 VIEW
Action1 EDIT
Action2 VIEW
Action3 VIEW
Action3 EDIT

我想使用 PIVOT (如果可能的话)来得到这样的结果:

Action1 VIEW EDIT
Action2 VIEW NULL
Action3 VIEW EDIT

使用 PIVOT 功能可以做到这一点吗?

195034 次浏览

好的,对于您的示例和任何具有有限数量的唯一列的示例,这应该可以了。

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

记住,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

如果您特别希望使用 SQLServerPIVOT 函数,那么假设您的两个原始列被称为 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

来自 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

餐桌设置:

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

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

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

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。这是美妙的,特别是出口大量的记录,以超越。我收到的具体报告请求是“每次有人提交苯那君索赔,他们提交的 F4,UR 和 UQ 领域的价值是什么。我有一个 OUTERAPPY,它创建了 ColTitle 和下面的值字段

PIVOT(
min(value)
FOR ColTitle in([F4], [UR], [UQ])
)