[SQL] 열에 피벗 행 집계하지 않고
SQL열에 피벗 행 집계하지 않고
어떻게 동적 피벗 SQL 문을 작성하는 내려고. TEST_NAME는 12 개까지의 값을 가질 수있는 경우 (따라서 12 열을 가짐). VAL 중 일부는 INT, 진수, 또는 VARCHAR 데이터 유형이 될 것입니다. 내가 본 대부분의 예제가 포함 골재의 일부를 가지고있다. 나는 직선 값 피벗에 대한 찾고 있어요.
Source Table
╔═══════════╦══════╦═══════╗
║ TEST_NAME ║ SBNO ║ VAL ║
╠═══════════╬══════╬═══════╣
║ Test1 ║ 1 ║ 0.304 ║
║ Test1 ║ 2 ║ 0.31 ║
║ Test1 ║ 3 ║ 0.306 ║
║ Test2 ║ 1 ║ 2.3 ║
║ Test2 ║ 2 ║ 2.5 ║
║ Test2 ║ 3 ║ 2.4 ║
║ Test3 ║ 1 ║ PASS ║
║ Test3 ║ 2 ║ PASS ║
╚═══════════╩══════╩═══════╝
Desired Output
╔══════════════════════════╗
║ SBNO Test1 Test2 Test3 ║
╠══════════════════════════╣
║ 1 0.304 2.3 PASS ║
║ 2 0.31 2.5 PASS ║
║ 3 0.306 2.4 NULL ║
╚══════════════════════════╝
해결법
-
==============================
1.피벗 기능이 작동하도록하기 위해 통합이 필요합니다. 당신의 발 열 당신이 중 하나를 MAX 또는 MIN 집계 함수를 사용해야합니다 있도록 VARCHAR가 나타납니다.
피벗 기능이 작동하도록하기 위해 통합이 필요합니다. 당신의 발 열 당신이 중 하나를 MAX 또는 MIN 집계 함수를 사용해야합니다 있도록 VARCHAR가 나타납니다.
테스트의 수는 제한되어있는 경우, 당신은 하드 코드 값을 할 수 있습니다
select sbno, Test1, Test2, Test3 from ( select test_name, sbno, val from yourtable ) d pivot ( max(val) for test_name in (Test1, Test2, Test3) ) piv;
데모와 SQL 바이올린을 참조하십시오.
당신의 OP에서, 당신은 당신이 열로 설정하는 행의 많은 수있을 것이라는 점을 밝혔다. 이런 경우, 당신은 동적 SQL을 사용할 수 있습니다 :
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT distinct ',' + QUOTENAME(TEST_NAME) from yourtable FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT sbno,' + @cols + ' from ( select test_name, sbno, val from yourtable ) x pivot ( max(val) for test_name in (' + @cols + ') ) p ' execute(@query)
데모와 SQL 바이올린을 참조하십시오.
두 버전 모두 같은 결과를 줄 것이다 :
| SBNO | TEST1 | TEST2 | TEST3 | --------------------------------- | 1 | 0.304 | 2.3 | PASS | | 2 | 0.31 | 2.5 | PASS | | 3 | 0.306 | 2.4 | (null) |
-
==============================
2.집계하지 않고 PIVOT 수있는 방법이 전혀 없습니다.
집계하지 않고 PIVOT 수있는 방법이 전혀 없습니다.
CREATE TABLE #table1 ( TEST_NAME VARCHAR(10), SBNO VARCHAR(10), VAL VARCHAR(10) ); INSERT INTO #table1 (TEST_NAME, SBNO, VAL) VALUES ('Test1' ,'1', '0.304'), ('Test1' ,'2', '0.31'), ('Test1' ,'3', '0.306'), ('Test2' ,'1', '2.3'), ('Test2' ,'2', '2.5'), ('Test2' ,'3', '2.4'), ('Test3' ,'1', 'PASS'), ('Test3' ,'2', 'PASS') WITH T AS ( SELECT SBNO, VAL, TEST_NAME FROM #table1 ) SELECT * FROM T PIVOT (MAX(VAL) FOR TEST_NAME IN([Test1], [Test2], [Test3])) P
-
==============================
3.해결 방법은 의무 집계는 오직 하나의 레코드에 적용되도록 할 수 있습니다. Excel에서 예를 들어 출력이 될 수있다 :
해결 방법은 의무 집계는 오직 하나의 레코드에 적용되도록 할 수 있습니다. Excel에서 예를 들어 출력이 될 수있다 :
여기서 행은 라벨 하단에 고유 인덱스 번호가 세포의 열이 포함되어 있습니다.
from https://stackoverflow.com/questions/15674373/pivot-rows-to-columns-without-aggregate by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 왜 절 곳에서 함수, 윈도우를하지? (0) | 2020.04.04 |
---|---|
[SQL] 왜 널은 널 false로 동일하지 않다 (0) | 2020.04.04 |
[SQL] SQL 서버 : 컬럼 트랜스 행 (0) | 2020.04.04 |
[SQL] 데이터베이스 ID 필드의 고유 식별자 대 INT (0) | 2020.04.04 |
[SQL] NOT이있는 대 LEFT OUTER에 SQL 성능 가입 (0) | 2020.04.04 |