SQL Сервер:Примеры преобразования строковых данных
-
09-06-2019 - |
Вопрос
Пытаюсь найти несколько простых примеров сводки SQL Server.Большинство примеров, которые я нашел, связаны с подсчетом или суммированием чисел.Я просто хочу свести некоторые строковые данные.Например, у меня есть запрос, возвращающий следующее.
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 или что-то еще.Это было здорово для одной записи или нескольких записей для одного пользователя.Но когда я хотел увидеть сотни записей и значения для всех пользователей, это должно было быть СВОДКОЙ.Это было замечательно, особенно для экспорта большого количества записей в Excel.Конкретный запрос на отчет, который я получил, гласил: "каждый раз, когда кто-то подавал заявку на Бенадрил, какую стоимость он указывал в полях F4, UR и UQ.У меня было ВНЕШНЕЕ ПРИЛОЖЕНИЕ, которое создавало 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;