Linhas em suas próprias colunas dependendo de seu valor
Pergunta
Eu tenho uma consulta seleção que atualmente produz os seguintes resultados:
Description Code Price
Product 1 A 5
Product 1 B 4
Product 1 C 2
Usando a seguinte consulta:
SELECT DISTINCT np.Description, p.promotionalCode, p.Price
FROM Price AS p INNER JOIN
nProduct AS np ON p.nProduct = np.Id
Eu quero produzir o seguinte:
Description A B C
Product 1 5 4 2
Solução
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
Aqui está um exemplo de teste simples:
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
Outras dicas
Se você estiver usando SQL Server 2005, você pode usar o novo operador PIVOT.
PIVOT simples -. O número de ordens de um cliente coloca para produtos individuais
Estrutura de uma tabela Order simples:
CREATE TABLE Sales.[Order]
(Customer varchar(8), Product varchar(5), Quantity int)
A tabela contém os seguintes valores:
Customer Product Quantity
Mike Bike 3
Mike Chain 2
Mike Bike 5
Lisa Bike 3
Lisa Chain 3
Lisa Chain 4
Ex: uma operação PIVOT na mesa da Ordem:
SELECT *
FROM Sales.[Order]
PIVOT (SUM(Quantity) FOR Product IN ([Bike],[Chain])) AS PVT
A saída esperada a partir desta consulta é:
Customer Bike Chain
Lisa 3 7
Mike 8 2
Se você não estiver usando o SQL Server, você pode procurar por "pivot" para o seu banco de dados.
A resposta de Duckworth é bom. Se você pode obter mais de um valor para cada célula, você pode querer usar AVG ou SUM vez de MIN, dependendo do que você quer ver.
Se seu DBMS suporta, você também pode querer olhar para uma consulta de tabela de referência cruzada, ou uma consulta de pivô. Por exemplo, MS Access tem consultas de referência cruzada.