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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top