2017-03-30 4 views
0

Ich habe diese Anfrage:anzeigen Abfrageergebnis anders

SELECT pr_products.product AS PRODUCT, pr_varieties.variety AS VARIETY, pr_grades.GRADE, SUM(pf_harvest.quantity) AS QUANTITY 
FROM pf_harvest 
INNER JOIN pf_performance ON pf_performance.id = pf_harvest.id_performance 
INNER JOIN pr_products ON pr_products.id = pf_harvest.id_product 
INNER JOIN pr_varieties ON pr_varieties.id = pf_harvest.id_variety 
INNER JOIN pr_grades ON pr_grades.id = pf_harvest.id_grade 
WHERE pf_performance.status = 100 
AND pf_harvest.id_tenant = 1 
AND pf_harvest.date = '2017-03-22' 
GROUP BY pf_harvest.id_product, pf_harvest.id_variety, pf_harvest.id_grade 
ORDER BY pf_harvest.id_product, pr_varieties.variety, pf_harvest.id_grade; 

Welche zeigt mir folgendes Ergebnis:

------------------------------------------------------------------- 
    PRODUCT  |  VARIETY  |  GRADE  |  QUANTITY | 
------------------------------------------------------------------- 
    ROSE  |  ROSEV1  |  GRADE1  |  1000  | 
------------------------------------------------------------------- 
    ROSE  |  ROSEV1  |  GRADE2  |  5000  | 
------------------------------------------------------------------- 
    ROSE  |  ROSEV2  |  GRADE1  |  2000  | 
------------------------------------------------------------------- 
    ROSE1  |  ROSE1V1  |  GRADE1  |  3500  | 
------------------------------------------------------------------- 

Ist es möglich, das Abfrageergebnis angezeigt werden wie folgt?

------------------------------------------------------------------- 
    PRODUCT  | VARIETY | GRADE1 | GRADE2 | TOTAL   | 
------------------------------------------------------------------- 
    ROSE  | ROSEV1 | 1000 | 5000 | 6000   | 
------------------------------------------------------------------- 
    ROSE  | ROSEV2 | 2000 | 0 | 2000   | 
------------------------------------------------------------------- 
    ROSE1  | ROSE1V1 | 3500 | 0 | 3500   | 
------------------------------------------------------------------- 

Ich habe versucht, die Abfrage zu ändern, aber ich konnte es nicht, und ich würde es wissen, wenn möglich, ich hoffe mir kann jemand helfen.

HINWEIS AKTUALISIERT: Es kann mehr GRADE im Abfrageergebnis (grade1, grade2, grade3 ...) sein.

Danke!

+0

Das Schwenken in SQL ist eine der häufigsten Fragen in allen RDBMS, zweifellos in den Hunderten von SO! Nachschlagen * bedingte Aggregation *. – Parfait

Antwort

1

Ändern Sie bitte Ihre aktuelle Abfrage von nicht Gruppierung auf der GRADE Spalte, sondern schwenken. Verwenden Sie dann die bedingte Aggregation, um die Spalten GRADE1 und GRADE2 zu berechnen.

SELECT t3.product AS PRODUCT, 
     t4.variety AS VARIETY, 
     SUM(CASE WHEN t5.GRADE = 'GRADE1' THEN t1.quantity ELSE 0 END) AS GRADE1, 
     SUM(CASE WHEN t5.GRADE = 'GRADE2' THEN t1.quantity ELSE 0 END) AS GRADE2, 
     SUM(CASE WHEN t5.GRADE = 'GRADE3' THEN t1.quantity ELSE 0 END) AS GRADE3, 
     -- hopefully it is clear how to add more grades 
     SUM(t1.quantity) AS TOTAL 
FROM pf_harvest t1 
INNER JOIN pf_performance t2 
    ON t2.id = t1.id_performance 
INNER JOIN pr_products t3 
    ON t3.id = pf_harvest.id_product 
INNER JOIN pr_varieties t4 
    ON t4.id = t1.id_variety 
INNER JOIN pr_grades t5 
    ON t5.id = t1.id_grade 
WHERE t2.status = 100 AND 
     t1.id_tenant = 1 AND 
     t1.date = '2017-03-22' 
GROUP BY t1.id_product, 
     t1.id_variety 
ORDER BY t1.id_product, 
     t4.variety, 
     t1.id_grade; 
+0

danke für Ihre Antwort, aber es kann mehr GRADES in der Abfrage Ergebnis (GRADE1, GRADE2, GRADE3 ...) –

+0

Dann werden Sie dynamische SQL dafür benötigen. Es gibt keine schnelle und schmutzige Lösung. –

+0

mehr Spaß! Lassen Sie uns diese unvollständige Frage kennzeichnen, sollen wir? – maSTAShuFu

0

versuchen diese

diesen Code

hinzugefügt auf dieser Spalte
sum(case when pr_grades.Grade='Grade1' then pf_harvest.quantity else 0 end)) [Grade1], 
     sum(case when pr_grades.Grade='Grade2' then pf_harvest.quantity else 0 end)) [Grade2] 

SELECT 
    pr_products.product AS PRODUCT, 
    pr_varieties.variety AS VARIETY, 
    sum(case when pr_grades.Grade='Grade1' then pf_harvest.quantity else 0 end)) [Grade1], 
    sum(case when pr_grades.Grade='Grade2' then pf_harvest.quantity else 0 end)) [Grade2], 
    SUM(pf_harvest.quantity) AS TOTAL 
FROM pf_harvest 
INNER JOIN pf_performance 
    ON pf_performance.id = pf_harvest.id_performance 
INNER JOIN pr_products 
    ON pr_products.id = pf_harvest.id_product 
INNER JOIN pr_varieties 
    ON pr_varieties.id = pf_harvest.id_variety 
INNER JOIN pr_grades 
    ON pr_grades.id = pf_harvest.id_grade 
WHERE pf_performance.status = 100 
AND pf_harvest.id_tenant = 1 
AND pf_harvest.date = '2017-03-22' 
GROUP BY pf_harvest.id_product, 
     pf_harvest.id_variety 
ORDER BY pf_harvest.id_product, pr_varieties.variety, pf_harvest.id_grade; 
+0

was meinst du? – maSTAShuFu

+0

Schöne Kopie meiner Antwort. –

+0

hat Ihre Antwort nicht kopiert. Ich habe gerade eine Reihe von Problemen behoben, als ich das Problem überprüft habe. FYI antwortete vor 11 Minuten .. Sie haben gerade vor 6 Minuten geantwortet. – maSTAShuFu