it-swarm.com.de

Mehrere Zeilen vom Abgleich bei mehreren CASE-Übereinstimmungen zurückgeben?

Ich möchte meiner Abfrage eine Spalte hinzufügen, in der eine oder mehrere Kategorien angegeben werden, mit denen eine Zeile übereinstimmt. Ich möchte das nehmen:

    +--------------+---------------+
Row | Product      | Quantity_Sold |
    +--------------+---------------+
1   | Coca-Cola    | 15            |
2   | Cigarettes   | 4             |
3   | Pretzel      | 6             |
4   | Beer         | 25            |
5   | Popcorn      | 10            |
6   | Candy Bar    | 10            |
    +--------------+---------------+

Und gib dies zurück:

    +--------------+---------------+----------------------+
Row | Product      | Quantity_Sold | Category             |
    +--------------+---------------+----------------------+
1   | Coca-Cola    | 15            | Beverages            |
2   | Cigarettes   | 4             | Controlled Substance |
3   | Pretzel      | 6             | Snacks               |
4   | Beer         | 25            | Beverages            |
5   | Beer         | 25            | Controlled Substance |
6   | Popcorn      | 10            | Snacks               |
7   | Candy Bar    | 10            | Snacks               |
    +--------------+---------------+----------------------+

Beachten Sie in Zeile 4-5 der Ausgabe, dass "Bier" in zwei Zeilen steht, da es in zwei Kategorien passt.

Wenn ich dies mit CASE versuche, nur die zuerst Übereinstimmung wird gezählt.

Diese Abfrage

SELECT
    Product,
    Quantity_Sold,
    CASE
        WHEN
            Product IN ('Coca-Cola', 'Beer')
        THEN
            'Beverages'
    CASE
        WHEN
            Product IN ('Pretzel', 'Popcorn', 'Candy Bar')
        THEN
            'Snacks'
    CASE
        WHEN
            Product IN ('Cigarettes', 'Beer')
        THEN
            'Controlled Substance'
    END
        AS Category
FROM sales_table;

Würde nur diese Ausgabe zurückgeben

    +--------------+---------------+----------------------+
Row | Product      | Quantity_Sold | Category             |
    +--------------+---------------+----------------------+
1   | Coca-Cola    | 15            | Beverages            |
2   | Cigarettes   | 4             | Controlled Substance |
3   | Pretzel      | 6             | Snacks               |
4   | Beer         | 25            | Beverages            |
5   | Popcorn      | 10            | Snacks               |
6   | Candy Bar    | 10            | Snacks               |
    +--------------+---------------+----------------------+

(Hinweis "Bier" erscheint nur einmal)

Wie kann ich dafür sorgen, dass es für alle übereinstimmenden Kategorien in separaten Zeilen angezeigt wird?

6
Nathan C. Lee

Ein Join wäre hier die beste Lösung.

Erstellen Sie eine Tabelle, die eine Liste von Kategorien enthält und welche Produkte ihnen zugeordnet sind, z. B. Produkt, Kategorie, die wir als Produktkategorien bezeichnen. Dann nehmen Sie an diesem Tisch teil.

SELECT p.Product, p.Quantity_Sold, pc.Category
FROM sales_table p
JOIN ProductCategories pc ON pc.Product = p.Product'

Dies hat den zusätzlichen Vorteil, dass Sie Ihre case-Anweisung nicht ändern müssen, wenn Sie weitere Kategorien hinzufügen (was schnell schwierig/unmöglich zu pflegen ist), und erfordert nur ein einfaches Einfügen in die neue Tabelle.

6
Sethcran

Da Sie keine permanente Tabelle erstellen können, können Sie einen CTE und einen Join verwenden.

WITH Category (Product,Category) AS
    (SELECT 'Coca-Cola','Beverages'
        UNION ALL
    SELECT 'Beer','Beverages'
        UNION ALL
    SELECT 'Pretzel','Snacks'
        UNION ALL
    SELECT 'Popcorn','Snacks'
        UNION ALL
    SELECT 'Candy Bar','Snacks'
        UNION ALL
    SELECT 'Cigarettes','Controlled Substance'
        UNION ALL
    SELECT 'Beer','Controlled Substance'
        )
SELECT
    sales_table.Product,
    Quantity_Sold,
    Category.Category
FROM sales_table
JOIN Category
    ON sales_table.Product = Category.Product;
1
Kenneth Fisher

Vielen Dank, Sethcran und Kenneth Fisher, für die Bereitstellung von Teilen dieser Antwort. Ich habe das letzte fehlende Teil hier gefunden: Oracle create table using with-Klausel (Stack Overflow)

Folgendes hat schließlich funktioniert:

WITH Category AS
    (SELECT 'Coca-Cola' AS Product,'Beverages' AS Category
        FROM dual
        UNION ALL
    SELECT 'Beer','Beverages'
        FROM dual
        UNION ALL
    SELECT 'Pretzel','Snacks'
        FROM dual
        UNION ALL
    SELECT 'Popcorn','Snacks'
        FROM dual
        UNION ALL
    SELECT 'Candy Bar','Snacks'
        FROM dual
        UNION ALL
    SELECT 'Cigarettes','Controlled Substance'
        FROM dual
        UNION ALL
    SELECT 'Beer','Controlled Substance'
        FROM dual
    )
SELECT
    sales_table.Product,
    sales_table.Quantity_Sold,
    Category.Category
FROM sales_table
JOIN Category
    ON sales_table.Product = Category.Product;
1
Nathan C. Lee