2010-02-22 10 views
5

Esta es probablemente una pregunta muy simple. Todo lo que quiero hacer realmente es convertir la columna en una fila cuyo tipo de datos sea un poco.¿Cómo se PIVOTE en un tipo de datos Bit en SQL Server?

SUM, MIN, MAX no funciona en bits. COUNT funciona, pero realmente no quiero contar. Solo quiero mover todo el material de las columnas a las filas, como si tomara un par de tijeras, cortara la información y la moviera -90 grados.

+0

supongo que estamos aquí para hacer puntos o ayudar a los demás? ¿En qué puedes convertir esos puntos? – JonH

Respuesta

4

La solución a esto es convertir el tipo de datos de bit a un tipo de datos que se acepta en funciones agregadas. Por ejemplo,

SELECT MAX(CAST(BitColumn AS TINYINT)) 

arroja el valor de BitColumn a un tipo de datos tinyint. La instrucción devuelve 1 si BitColumn contiene al menos un valor de 1; de lo contrario, devuelve 0 (a menos que todos los valores sean nulos).

Suponiendo lo siguiente:

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

Usted puede pivotar estos datos utilizando la siguiente consulta

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 

En este caso, el valor máximo BitColumn se convierte de nuevo a partir tinyint a poco. Esto no es requerido.

Los resultados son

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

consulta alternativa, para SQL Server 2005 y versiones posteriores, se utiliza el operador 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

esta solución funciona. Pero no devolverá valores de bit cuando ejecute la consulta. es posible moldear columnas de pivote, pero cuando se trata de un pivote dinámico es un poco difícil. – 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

esta solución funciona. Pero no devolverá valores de bit cuando ejecute la consulta. – Rapunzo

Cuestiones relacionadas