2010-02-22 28 views
5

To prawdopodobnie bardzo proste pytanie. Wszystko, co naprawdę chcę zrobić, to uczynić kolumnę w wierszu, którego typ danych jest nieco.Jak działa PIVOT na typ danych bitowych w SQL Server?

SUMA, MIN, MAX nie działa na bitach. COUNT działa, ale naprawdę nie chcę się liczyć. Chcę tylko przenieść wszystkie rzeczy z kolumn do rzędów, tak jakbym wziął nożyczki, wyciął informację i przesunął ją o 90 stopni.

+0

Chyba jesteśmy tutaj, aby punkty lub pomóc innym? Do czego możesz włączyć te punkty? – JonH

Odpowiedz

4

Rozwiązaniem tego problemu jest rzutowanie typu danych bitowych na typ danych akceptowany w zagregowanych funkcjach. Na przykład:

SELECT MAX(CAST(BitColumn AS TINYINT)) 

rzuca wartość BitColumn na tinyint typ danych. Instrukcja zwraca 1, jeśli wartość BitColumn zawiera co najmniej jedną wartość równą 1; w przeciwnym razie zwraca 0 (chyba że wszystkie wartości są zerowe).

przyjmując:

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

można obracać te dane za pomocą następującego zapytania

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 

W tym przypadku, maksymalna wartość BitColumn przekształca się z powrotem tinyint bitowi. To nie jest wymagane.

Wyniki są

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

Alternatywą kwerendy SQL Server 2005 i później wykorzystuje operator 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

ten Solutuon działa. Ale nie zwróci wartości bitowych podczas wykonywania zapytania. jest to możliwe do rzucania kolumnami obrotowymi, ale gdy jest dynamiczny, jest to trochę trudne. – 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

ten solutuon działa. Ale nie zwróci wartości bitowych podczas wykonywania zapytania. – Rapunzo

Powiązane problemy