2010-02-22 3 views
5

이것은 아마도 매우 간단한 질문입니다. 내가 실제로하고 싶은 것은 컬럼을 데이터 타입이 조금있는 행으로 만드는 것입니다.SQL Server에서 Bit 데이터 형식을 PIVOT하려면 어떻게합니까?

SUM, MIN, MAX는 비트에서 작동하지 않습니다. 카운트는 작동하지만 계산하고 싶지는 않습니다. 나는 가위를 가지고 가면 정보를 잘라서 -90도 정도 옮기는 것처럼 열에서 모든 것을 옮길뿐입니다.

+0

나는 우리가 포인트를 만들거나 다른 사람들을 돕기 위해 여기에 있습니다 생각? 그 점들을 무엇으로 바꿀 수 있습니까? – JonH

답변

4

이 솔루션은 비트 데이터 형식을 집계 함수에서 허용되는 데이터 형식으로 캐스팅하는 것입니다. 예를 들어,

SELECT MAX(CAST(BitColumn AS TINYINT)) 

TINYINT는 데이터 유형에 BitColumn 값 캐스트. BitColumn에 적어도 하나의 값 1이 포함되어 있으면 명령문은 1을 반환합니다. 그렇지 않으면 0을 반환합니다 (모든 값이 null이 아닌 경우).

다음과 같은 가정 :

CREATE TABLE MyTable (ID INT, Name VARCHAR(10), BitColumn BIT); 

INSERT INTO MyTable VALUES (1, 'Name 1', 1); 
INSERT INTO MyTable VALUES (1, 'Name 2', 0); 
INSERT INTO MyTable VALUES (1, 'Name 3', 1); 
INSERT INTO MyTable VALUES (2, 'Name 1', 1); 
INSERT INTO MyTable VALUES (2, 'Name 2', 1); 
INSERT INTO MyTable VALUES (2, 'Name 3', 1); 
INSERT INTO MyTable VALUES (3, 'Name 1', 0); 
INSERT INTO MyTable VALUES (3, 'Name 2', 0); 
INSERT INTO MyTable VALUES (3, 'Name 3', 0); 

당신은이 경우 다음 쿼리

SELECT ID, 
    CAST(MAX(CASE Name WHEN 'Name 1' THEN CAST(BitColumn AS TINYINT) ELSE NULL END) AS BIT) AS [Name 1], 
    CAST(MAX(CASE Name WHEN 'Name 2' THEN CAST(BitColumn AS TINYINT) ELSE NULL END) AS BIT) AS [Name 2], 
    CAST(MAX(CASE Name WHEN 'Name 3' THEN CAST(BitColumn AS TINYINT) ELSE NULL END) AS BIT) AS [Name 3] 
FROM MyTable 
GROUP BY ID 
ORDER BY ID 

를 사용하여이 데이터를 피벗 수 있으며, 최대 BitColumn 값은 비트 TINYINT에서 다시 변환된다. 반드시 필요한 것은 아닙니다.

결과는

ID Name 1 Name 2 Name 3 
-------------------------- 
1 1  0  1 
2 1  1  1 
3 0  0  0 

는 SQL 서버 2005, 또 다른 쿼리하고 후, PIVOT 연산자를 사용

SELECT ID, [Name 1], [Name 2], [Name 3] 
FROM 
    (
    SELECT ID, Name, CAST(BitColumn AS TINYINT) AS BitColumn 
    FROM MyTable 
    ) as SourceTable 
PIVOT 
(
MAX(BitColumn) FOR Name in ([Name 1], [Name 2], [Name 3]) 
) AS PivotTable 
+0

이 solutuon 작동합니다. 그러나 쿼리를 실행할 때 비트 값을 반환하지 않습니다. 피벗 열을 캐스팅 할 수 있지만 동적 피벗 일 때 약간 힘들 수 있습니다. – Rapunzo

2
SELECT [1], [2], [3] 
FROM 
    (
    SELECT ID, CAST(BitColumn AS TINYINT) AS INTColumn 
    FROM MyTable 
    ) as SourceTable 
PIVOT 
(
MAX(INTColumn) FOR ID in ([1], [2], [3]) 
) AS PivotTable 
+0

이 solutuon 작동합니다. 그러나 쿼리를 실행할 때 비트 값을 반환하지 않습니다. – Rapunzo

관련 문제