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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top