SQL Server : PIVOTing 문자열 데이터의 예


125

간단한 SQL Server PIVOT 예제를 찾으려고합니다. 내가 찾은 대부분의 예는 숫자를 세거나 합산하는 것과 관련이 있습니다. 문자열 데이터를 피벗하고 싶습니다. 예를 들어 다음을 반환하는 쿼리가 있습니다.

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

가능한 경우 PIVOT을 사용하여 다음과 같은 결과를 만들고 싶습니다.

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

PIVOT 기능으로도 가능합니까?



이 링크를보십시오 : dotnetgalactics.wordpress.com/2009/10/23/… 도움이 될 수 있습니다;)
Pato

고유 항목의 수를 알 수없는 경우이 링크를 볼 수 있습니다. 즉, 피벗 후 동적 열이 없음을 의미합니다. SQL 서버 피벗 : 동적 쿼리와 열을 행으로 변환
maeenul

답변:


165

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

+1 야 ... 당신은 정말 천재입니다. 피벗하는 법을 배우는 대신에 이것을 더 빨리 알 수 있었으면 좋겠어요!
ashes999

@ Silmaril89는 문제의 두 번째 열 이름이 'data'이고 첫 번째 열이 'Action'이라고 가정합니다.
Iman

1
...ELSE NULL END...대신 사용 하지 말아야 할 이유 가 ...ELSE '' END...있습니까?
월.

15
어느 것이 더 빠릅니까, 이것 또는 PIVOT?
Robert Jeppesen

우와, 당신은 내 마음을 날려 버렸습니다. 내 머릿속에는 SQL 서버가 "그냥 해야지!"라는 생각이 있었지만 할 수 없다고 생각했습니다. 그리고 이걸 봤어요.
David Hay

54

테이블 설정 :

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

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


이 희귀하고 명확한 답변에 감사드립니다.
즉석

나는 이것이 오래되었다는 것을 알고 있지만 이것은 내가 본 것 중 가장 명확하고 가장 잘 설명 된 피벗 데모입니다.
Stan Shaw

52

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


6

글쎄요, 당신의 샘플과 제한된 수의 고유 열이있는 모든 경우에는이 작업을 수행해야합니다.

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

5
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;

0

문자열을 구문 분석하고 문제의 문자열의 처음 두 위치가 의료 청구 코딩 표준의 필드 이름이되는 상황이있었습니다. 그래서 나는 문자열을 제거하고 F4, UR 및 UQ 또는 기타 값을 얻습니다. 이것은 한 사용자에 대해 한 레코드 또는 몇 개의 레코드에서 훌륭했습니다. 그러나 수백 개의 레코드와 모든 사용자에 대한 값을보고 싶을 때는 PIVOT이 필요했습니다. 이것은 특히 많은 레코드를 Excel로 내보낼 때 훌륭했습니다. 내가받은 구체적인보고 요청은 "누군가 Benadryl에 대한 클레임을 제출할 때마다 F4, UR 및 UQ 필드에 어떤 값을 제출 했는가. ColTitle을 생성 한 OUTER APPLY와 아래 값 필드

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.