Pivot-Tabelle mit mehreren Wertespalten

Vlad

Ich habe eine Postgres-Tabelle mit Produktdaten verschiedener Hersteller, hier die vereinfachte Tabellenstruktur:

CREATE TABLE test_table (
  sku               text,
  manufacturer_name text,
  price             double precision,
  stock             int
);

INSERT INTO test_table
VALUES ('sku1', 'Manufacturer1', 110.00, 22),
       ('sku1', 'Manufacturer2', 120.00, 15),
       ('sku1', 'Manufacturer3', 130.00, 1),
       ('sku1', 'Manufacturer3', 30.00, 11),
       ('sku2', 'Manufacturer1', 10.00, 2),
       ('sku2', 'Manufacturer2', 9.00,  3),
       ('sku3', 'Manufacturer2', 21.00, 3),
       ('sku3', 'Manufacturer2', 1.00, 7),
       ('sku3', 'Manufacturer3', 19.00, 5);

Ich muss jeden Hersteller für jede SKU ausgeben, aber wenn es mehrere identische Hersteller für dieselbe SKU gibt, muss ich den Hersteller mit dem niedrigsten Preis auswählen (beachten Sie, dass ich auch die Spalte "Lager" einfügen muss), hier gewünschte Ergebnisse:

| sku  | man1_price | man1_stock | man2_price | man2_stock | man3_price | man3_stock |
|------|------------|------------|------------|------------|------------|------------|
| sku1 | 110.0      | 22         | 120.0      | 15         | 30.0       | 11         |
| sku2 | 10.0       | 2          | 9.0        | 3          |            |            |
| sku3 |            |            | 1.0        | 7          | 19.0       | 5          |

Ich habe versucht, Postgres zu verwenden crosstab():

SELECT *
FROM crosstab('SELECT sku, manufacturer_name, price
              FROM test_table
              ORDER BY 1,2',
              $$ SELECT DISTINCT manufacturer_name FROM test_table ORDER BY 1 $$
       )
       AS ct (sku text, "man1_price" double precision,
              "man2_price" double precision,
              "man3_price" double precision
    );

Dies erzeugt jedoch eine Tabelle mit nur einer priceSpalte. Und ich habe keine Möglichkeit gefunden, die stockSpalte einzuschließen.

Ich habe auch versucht, die bedingte Aggregation zu verwenden:

SELECT sku,
   MIN(CASE WHEN manufacturer_name = 'Manufacturer1' THEN price END) as man1_price,
   MIN(CASE WHEN manufacturer_name = 'Manufacturer1' THEN stock END) as man1_stock,
   MIN(CASE WHEN manufacturer_name = 'Manufacturer2' THEN price END) as man2_price,
   MIN(CASE WHEN manufacturer_name = 'Manufacturer2' THEN stock END) as man2_stock,
   MIN(CASE WHEN manufacturer_name = 'Manufacturer3' THEN price END) as man3_price,
   MIN(CASE WHEN manufacturer_name = 'Manufacturer3' THEN stock END) as man3_stock
FROM test_table
GROUP BY sku
ORDER BY sku

Und diese Abfrage funktioniert auch in meinem Fall nicht - sie wählt einfach den Mindestbestand aus - aber wenn es nur wenige gleiche Hersteller für denselben Artikel, aber mit unterschiedlichen Preisen / Lagerbeständen gibt, wählt diese Abfrage den Mindestpreis eines Herstellers und den Mindestbestand aus Ein weiterer.

Wie kann ich die priceentsprechenden und entsprechenden Hersteller stockaus dieser Tabelle ausgeben ?

PS Vielen Dank für diese hilfreichen Antworten. Meine Postgres-Tabelle ist ziemlich klein - es gibt nicht mehr als 15.000 Produkte (ich weiß nicht, ob solche Zahlen für einen korrekten Vergleich nützlich sein können), aber da Erwin Brandstetter darum gebeten hat, die Leistung verschiedener Abfragen zu vergleichen, mit denen ich 3 Abfragen ausgeführt habe EXPLAIN ANALYZE, sind hier ihre Ausführungszeit:

Erwin Brandstetter query:        400 - 450 ms 
Kjetil S query:                  250 - 300 ms
Gordon Linoff query:             200 - 250 ms
a_horse_with_no_name query:      250 - 300 ms

Nochmals - ich bin mir nicht sicher, ob diese Zahlen als Referenz nützlich sein können. Für meinen Fall wähle ich die kombinierte Version Kjetil Sund Gordon LinoffAbfragen aber Erwin Brandstetterund a_horse_with_no_nameVarianten sind auch sehr nützlich und interessant. Es ist erwähnenswert, dass, wenn meine Tabelle in Zukunft mehr als wenige Hersteller haben würde - das Anpassen der Abfrage und das Eingeben ihrer Namen jedes Mal wäre mühsam - und daher die Abfrage aus der a_horse_with_no_nameAntwort am bequemsten zu verwenden wäre.

Kjetil S.

Ihre letzte Auswahl funktioniert fast . Sie sollten jedoch eine where-Bedingung hinzufügen, bei der Zeilen mit nicht minimalen Preisen pro SKU und Hersteller entfernt werden. Dies führt zu Ihrem erwarteten Ergebnis:

select
  sku,
  min( case when manufacturer_name='Manufacturer1' then price end ) man1_price,
  min( case when manufacturer_name='Manufacturer1' then stock end ) man1_stock,
  min( case when manufacturer_name='Manufacturer2' then price end ) man2_price,
  min( case when manufacturer_name='Manufacturer2' then stock end ) man2_stock,
  min( case when manufacturer_name='Manufacturer3' then price end ) man3_price,
  min( case when manufacturer_name='Manufacturer3' then stock end ) man3_stock
from test_table t
where not exists (
    select 1 from test_table
    where sku=t.sku
    and manufacturer_name=t.manufacturer_name
    and price<t.price
)
group by sku
order by 1;

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Datenrahmen mit mehreren Wertespalten umformen

Pivot-Tabelle in Pandas mit mehreren Spalten

Pivot-Tabelle mit mehreren Schlüsselspalten

Pivot-Tabelle mit mehreren Spalten in SQL?

Pivot-Tabelle in SQL mit mehreren Spalten

Zählen / Pivot der Tabelle mit mehreren Werten in der Zelle

MySQL-Abfrage mit Pivot-Tabelle und mehreren Joins

Laravel 7 : Pivot an Tabelle mit mehreren Werten anhängen

Pivot-Tabelle mit mehreren Spalten von Groupby Python

Erstellen einer Pivot-Tabelle mit mehreren Hierarchien in Pandas

INDEX MATCH mit mehreren Kriterien aus der Pivot-Tabelle

Pivot-Tabelle mit mehreren Feldern in SQL Server

Pandas Pivot-Tabelle mit mehreren Informationen in Zellen

Verbinden Sie die Pivot-Tabelle mit mehreren Tabellen in Eloquent

Erstellen einer Pivot-Tabelle mit mehreren Spalten in R.

Erstellen Sie eine Pivot-Tabelle mit mehreren hierarchischen Spaltengruppen

Pandas-Pivot-Tabelle mit mehreren Spalten gleichzeitig

Laravel Eloquent: Tabelle über Pivot mit mehreren Beziehungen an eine andere Tabelle binden another

Pivot mit mehreren Spalten

TSQL Pivot 4-Wertespalten

So erstellen Sie ein Wörterbuch mit einer Indexschlüsselspalte und mehreren Wertespalten

So sortieren Sie die Spaltenüberschrift einer Pivot-Tabelle mit mehreren Indizes mithilfe von Listen

Java Poi XSSF - Pivot-Tabelle mit mehreren erweiterbaren Spalten erstellen

Pandas-Pivot-Tabelle, in der die Spalte eine Zeichenfolge mit mehreren Kategorien enthält

Abfragen der Pivot-Tabelle mit mehreren Fremdschlüsseln Laravel 5 Eloquent

Wie erstelle ich eine Pivot-Tabelle in Pandas mit mehreren Indizes?

Erstellen Sie eine dynamische PIVOT-Tabelle mit mehreren aggregierten Funktionen in SQL Server

Erstellen Sie eine proportionale Pivot-Tabelle mit mehreren Variablen in R.

Entfernen der Zwischensumme aus einer Excel-Pivot-Tabelle mit mehreren Datenfeldern mithilfe von vba

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  3. 3

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  4. 4

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  7. 7

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  8. 8

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  9. 9

    Eclipse Oxygen - Projekte verschwinden

  10. 10

    Wie wählt man Unterschiede mit drei Tabellen aus?

  11. 11

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  12. 12

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  13. 13

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  14. 14

    Wie kann ich den Kaskadenmodus global einstellen?

  15. 15

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  16. 16

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  17. 17

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  18. 18

    Was ist schneller: SUM über NULL oder über 0?

  19. 19

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  20. 20

    Kann ich ein Tkinter-Canvas erstellen, das mehrere Zeilen in einem Text-Widget umfasst?

  21. 21

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

heißlabel

Archiv