Filas en sus propias columnas según su valor
Pregunta
Tengo una consulta de selección que actualmente produce los siguientes resultados:
Description Code Price
Product 1 A 5
Product 1 B 4
Product 1 C 2
Usando la siguiente consulta:
SELECT DISTINCT np.Description, p.promotionalCode, p.Price
FROM Price AS p INNER JOIN
nProduct AS np ON p.nProduct = np.Id
Quiero producir lo siguiente:
Description A B C
Product 1 5 4 2
Solución
SELECT
np.Id,
np.Description,
MIN(Case promotionalCode WHEN 'A' THEN Price ELSE NULL END) AS 'A',
MIN(Case promotionalCode WHEN 'B' THEN Price ELSE NULL END) AS 'B',
MIN(Case promotionalCode WHEN 'C' THEN Price ELSE NULL END) AS 'C'
FROM
Price AS p
INNER JOIN nProduct AS np ON p.nProduct = np.Id
GROUP BY
np.Id,
np.Description
Aquí hay un ejemplo de prueba simple:
DECLARE @temp TABLE (
id INT,
description varchar(50),
promotionalCode char(1),
Price smallmoney
)
INSERT INTO @temp
select 1, 'Product 1', 'A', 5
union
SELECT 1, 'Product 1', 'B', 4
union
SELECT 1, 'Product 1', 'C', 2
SELECT
id,
description,
MIN(Case promotionalCode WHEN 'A' THEN Price ELSE NULL END) AS 'A',
MIN(Case promotionalCode WHEN 'B' THEN Price ELSE NULL END) AS 'B',
MIN(Case promotionalCode WHEN 'C' THEN Price ELSE NULL END) AS 'C'
FROM
@temp
GROUP BY
id,
description
Otros consejos
Si está utilizando SQL Server 2005, puede usar el nuevo operador PIVOT.
PIVOTE simple: la cantidad de pedidos que un cliente realiza para productos individuales.
Estructura de una tabla de orden simple:
CREATE TABLE Sales.[Order]
(Customer varchar(8), Product varchar(5), Quantity int)
La tabla contiene los siguientes valores:
Customer Product Quantity
Mike Bike 3
Mike Chain 2
Mike Bike 5
Lisa Bike 3
Lisa Chain 3
Lisa Chain 4
Ej: una operación PIVOT en la tabla de pedidos:
SELECT *
FROM Sales.[Order]
PIVOT (SUM(Quantity) FOR Product IN ([Bike],[Chain])) AS PVT
El resultado esperado de esta consulta es:
Customer Bike Chain
Lisa 3 7
Mike 8 2
Si no está utilizando SQL Server, puede buscar " pivote " para su base de datos.
La respuesta de Duckworth es buena. Si puede obtener más de un valor para cada celda, es posible que desee usar AVG o SUM en lugar de MIN, dependiendo de lo que quiera ver.
Si su DBMS lo admite, es posible que también desee consultar una consulta de tabla de referencias cruzadas o una consulta dinámica. Por ejemplo, MS Access tiene consultas de referencias cruzadas.