Frage

Ich habe eine Auswahlabfrage, die derzeit die folgenden Ergebnisse erzielt:

Description   Code    Price
 Product 1     A        5
 Product 1     B        4
 Product 1     C        2

Mit der folgenden Abfrage:

SELECT DISTINCT np.Description, p.promotionalCode, p.Price
FROM            Price AS p INNER JOIN
                         nProduct AS np ON p.nProduct = np.Id

Ich möchte folgendes erzeugen:

Description  A  B  C
 Product 1   5  4  2
War es hilfreich?

Lösung

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

Hier ist ein einfacher Test Beispiel:

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

Andere Tipps

Wenn Sie SQL Server 2005 verwenden, können Sie den neuen PIVOT-Operator verwenden.

Einfache PIVOT -. Die Anzahl der Aufträge ein Kunde für einzelne Produkte

Struktur einer einfachen Auftrags-Tabelle:

CREATE TABLE Sales.[Order]
    (Customer varchar(8), Product varchar(5), Quantity int)

Die Tabelle enthält die folgenden Werte:

Customer Product Quantity
    Mike     Bike    3
    Mike     Chain   2
    Mike     Bike    5
    Lisa     Bike    3
    Lisa     Chain   3
    Lisa     Chain   4

Ex: ein Pivotisierungsoperation auf der Auftrags-Tabelle:

SELECT *
    FROM Sales.[Order]
    PIVOT (SUM(Quantity) FOR Product IN ([Bike],[Chain])) AS PVT

Die erwartete Ausgabe dieser Abfrage lautet:

Customer Bike Chain
Lisa        3    7
Mike        8    2

Wenn Sie nicht SQL Server verwenden, könnten Sie für „Pivot“ für Ihre Datenbank finden.

Duckworth Antwort ist gut. Wenn Sie mehr als einen Wert für jede Zelle erhalten können, können Sie AVG oder SUM verwenden anstelle von MIN, je nachdem, was Sie sehen wollen.

Wenn Ihr DBMS unterstützt, mögen Sie vielleicht auch in eine Crosstab Abfrage suchen, oder eine Dreh Abfrage. Zum Beispiel MS Access hat Kreuztabellen- Abfragen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top