SQL服务器:对字符串数据进行 PIVOT 操作的示例
-
09-06-2019 - |
题
尝试找到一些简单的 SQL Server PIVOT 示例。我发现的大多数例子都涉及对数字进行计数或求和。我只想旋转一些字符串数据。例如,我有一个返回以下内容的查询。
Action1 VIEW
Action1 EDIT
Action2 VIEW
Action3 VIEW
Action3 EDIT
我想使用 PIVOT (如果可能的话)来使结果如下:
Action1 VIEW EDIT
Action2 VIEW NULL
Action3 VIEW EDIT
这是否可以通过 PIVOT 功能实现?
解决方案
请记住,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
其他提示
如果您特别想使用 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
表设置:
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
两个查询结果:
从 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
好吧,对于您的样本和任何具有有限数量的唯一列的样本,这应该可以做到。
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
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。这非常棒,尤其是对于导出大量记录到 Excel 来说。我收到的具体报告请求是“每次有人提交苯那君索赔时,他们在 F4、UR 和 UQ 字段中提交了哪些值。我有一个 OUTER APPLY 创建了 ColTitle 和下面的值字段
PIVOT(
min(value)
FOR ColTitle in([F4], [UR], [UQ])
)
您可以将其与旋转一起使用:
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;
不隶属于 StackOverflow