Zeilen in ihren eigenen Spalten je nach ihrem Wert
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
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.