Как вы PIVOT на битовый тип данных в SQL Server? - PullRequest
6 голосов
/ 22 февраля 2010

Это, наверное, очень простой вопрос. Все, что я действительно хочу сделать, это сделать столбец строкой с типом данных немного.

SUM, MIN, MAX не работает на битах. COUNT работает, но я действительно не хочу считать. Я просто хочу переместить все вещи из столбцов в ряды, как если бы я взял ножницы, вырезал информацию и переместил ее на -90 градусов.

Ответы [ 2 ]

5 голосов
/ 22 января 2011

Решением этой проблемы является приведение типа данных битов к типу данных, который принят в агрегатных функциях. Например,

SELECT MAX(CAST(BitColumn AS TINYINT))

преобразует значение BitColumn в тип данных tinyint. Оператор возвращает 1, если BitColumn содержит хотя бы одно значение 1; в противном случае возвращается 0 (если все значения не равны нулю).

Предполагая следующее:

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 Server 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
2 голосов
/ 07 июня 2011
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
...