[sql-server] SQL Server : PIVOTing 문자열 데이터의 예

간단한 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


답변

테이블 설정 :

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

두 쿼리 결과 :
여기에 이미지 설명 입력


답변

특별히 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


답변

에서 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로 내보낼 때 훌륭했습니다. 내가받은 구체적인보고 요청은 “누군가 Benadryl에 대한 클레임을 제출할 때마다 F4, UR 및 UQ 필드에 어떤 값을 제출 했는가. ColTitle을 생성 한 OUTER APPLY와 아래 값 필드

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