2017-03-30 128 views
0

我有这个疑问:显示查询结果不同

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; 

这我显示了以下结果:

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

是否可以按下列步骤显示查询结果?

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

我试图改变查询,但我不能,我想知道是否有可能,我希望有人能帮助我。

UPDATED 注意:查询结果(GRADE1,GRADE2,GRADE3 ...)中可能会有更多的GRADES。

谢谢!

+0

在SQL中旋转是所有RDBMS中最常见的问题之一,毫无疑问在数百个SO!查找*条件聚合*。 – Parfait

回答

1

通过不分组对GRADE列修改当前的查询,而是转动该列。然后,使用条件聚合来计算GRADE1GRADE2列。

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

感谢您的回答,但查询结果中可能会有更多的GRADE(GRADE1,GRADE2,GRADE3 ...) –

+0

然后,您将需要动态SQL。没有快速和肮脏的解决方案。 –

+0

更有趣!让我们举出这个不完整的问题吗? – maSTAShuFu

0

试试这个

添加该代码

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

你是什么意思? – maSTAShuFu

+0

我的答案的好副本。 –

+0

没有复制你的答案..我刚刚纠正了一些文书问题,当我审查了问题。仅供参考11分钟前回答..你刚刚回答6分钟前。 – maSTAShuFu