문제

몇 가지 간단한 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

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

에서 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])
 )

피벗팅과 함께 이것을 사용할 수 있습니다:

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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top