Сведения о вопросе

Математик

00:02, 24th August, 2020

Теги

sql-server   tsql   pivot    

SQL сервер: примеры строковых данных PIVOTing

Просмотров: 505   Ответов: 8

Пытаюсь найти несколько простых примеров SQL Server PIVOT. Большинство примеров, которые я нашел, связаны с подсчетом или суммированием чисел. Я просто хочу pivot некоторые строковые данные. Например, у меня есть запрос, возвращающий следующее.

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

Я хотел бы использовать PIVOT (если это вообще возможно), чтобы сделать результаты такими:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

Возможно ли это вообще с помощью функции PIVOT?



  Сведения об ответе

DAAA

19:39, 21st August, 2020

Помните, что агрегатная функция 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


  Сведения об ответе

PAGE

16:57, 12th August, 2020

Если вы специально хотите использовать функцию 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


  Сведения об ответе

davran

02:32, 24th August, 2020

Настройка таблицы:

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



  Сведения об ответе

PAGE

09:14, 25th August, 2020

От 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


  Сведения об ответе

PAGE

12:02, 26th August, 2020

Ну, для вашего образца и любого с ограниченным количеством уникальных столбцов, это должно сделать это.

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


  Сведения об ответе

SSESION

01:14, 29th August, 2020

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;


  Сведения об ответе

lats

02:03, 4th August, 2020

У меня была ситуация, когда я разбирал строки, и первые две позиции рассматриваемой строки были бы именами полей стандарта кодирования медицинских утверждений. Поэтому я бы убрал строки и получил значения для F4, UR и UQ или еще чего-нибудь. Это было здорово на одной записи или нескольких записях для одного пользователя. Но когда я хотел увидеть сотни записей и значения для всех пользователей, это должно было быть PIVOT. Это было замечательно, особенно для экспорта большого количества записей в excel. Конкретный запрос об отчетности, который я получил, был следующим: "каждый раз, когда кто-то подавал заявку на Бенадрил, какое значение они представляли в полях F4, UR и UQ. У меня была внешняя заявка, которая создала поля ColTitle и value ниже

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


  Сведения об ответе

PROGA

19:56, 17th August, 2020

Вы можете использовать это с поворотом:

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;


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться