SQL中生成的行集的总和

时间:2015-08-18 19:25:24

标签: sql sql-server

我有以下查询:

SELECT DISTINCT CU.permit_id, CU.month, /*CU.year,*/ M.material_id, M.material_name, /*MC.chemical_id, C.chemical_name,
C.precursor_organic_compound, C.non_precursor_organic_compound,*/
/*MC.chemical_percentage,*/
POC_emissions =
        CASE
        WHEN (C.precursor_organic_compound = 'true')
                THEN (CU.chemical_usage_lbs / CU.material_density) * M.VOC
        ELSE 0
        END,
NON_POC_emissions = 
        CASE
        WHEN (C.non_precursor_organic_compound = 'true')
                THEN CU.chemical_usage_lbs * (MC.chemical_percentage / 100)
        ELSE 0
        END
FROM material M
LEFT OUTER JOIN material_chemical MC ON MC.material_id = M.material_id
LEFT OUTER JOIN chemical_usage CU ON CU.material_id = MC.material_id
LEFT OUTER JOIN chemical C ON C.chemical_id = MC.chemical_id
WHERE (CU.month >=1 AND CU.month <= 2)
AND CU.year = 2013
AND M.material_id = 52
--AND CU.permit_id = 2118
--GROUP BY CU.permit_id, M.material_id, M.material_name, CU.month, MC.chemical_id, MC.chemical_id, C.chemical_name, C.precursor_organic_compound, C.non_precursor_organic_compound
--ORDER BY C.chemical_name ASC

返回:

enter image description here

但我需要的是每个材料每月返回一行,每月增加POC值和每月NON_POC值。

所以,我最终会得到类似的东西:

Month    material_id     material_name     POC           NON_POC
1        52              Krylon...         0.107581      0.074108687
2        52              Krylon...         0.143437      0.0988125

我尝试使用SUM,但它多次总结相同的结果:

SELECT /*DISTINCT*/ CU.permit_id, CU.month, /*CU.year,*/ M.material_id, M.material_name, /*MC.chemical_id, C.chemical_name,
C.precursor_organic_compound, C.non_precursor_organic_compound,*/
--MC.chemical_percentage,
POC_emissions = SUM( 
        CASE
        WHEN (C.precursor_organic_compound = 'true')
                THEN (CU.chemical_usage_lbs / CU.material_density) * M.VOC
        ELSE 0
        END),
NON_POC_emissions = SUM( 
        CASE
        WHEN (C.non_precursor_organic_compound = 'true')
                THEN CU.chemical_usage_lbs * (MC.chemical_percentage / 100)
        ELSE 0
        END)
FROM material M
LEFT OUTER JOIN material_chemical MC ON MC.material_id = M.material_id
LEFT OUTER JOIN chemical_usage CU ON CU.material_id = MC.material_id
LEFT OUTER JOIN chemical C ON C.chemical_id = MC.chemical_id
WHERE M.material_id = 52
--AND CU.permit_id = 187
AND (CU.month >=1 AND CU.month <= 2)
AND CU.year = 2013
GROUP BY CU.permit_id, M.material_id, M.material_name, CU.month/*, CU.year, MC.chemical_id, C.chemical_name, C.precursor_organic_compound, C.non_precursor_organic_compound*/
--ORDER BY C.chemical_name ASC

enter image description here

2 个答案:

答案 0 :(得分:4)

第一个查询有一个DISTINCT子句。没有DISTINCT子句的输出是什么。我怀疑你的截图中显示的行数多于节目数。

无论如何,你可以尝试这样的东西来获得理想的结果。

select permit_id, month, material_id, material_name, 
       sum(poc_emissions), sum(non_poc_emissions)
from (

    SELECT DISTINCT CU.permit_id, CU.month, M.material_id, M.material_name, 
    POC_emissions =
        CASE
        WHEN (C.precursor_organic_compound = 'true')
                THEN (CU.chemical_usage_lbs / CU.material_density) * M.VOC
        ELSE 0
        END,
    NON_POC_emissions = 
        CASE
        WHEN (C.non_precursor_organic_compound = 'true')
                THEN CU.chemical_usage_lbs * (MC.chemical_percentage / 100)
        ELSE 0
        END
    FROM material M
    LEFT OUTER JOIN material_chemical MC ON MC.material_id = M.material_id
    LEFT OUTER JOIN chemical_usage CU ON CU.material_id = MC.material_id
    LEFT OUTER JOIN chemical C ON C.chemical_id = MC.chemical_id
    WHERE (CU.month >=1 AND CU.month <= 2)
      AND CU.year = 2013
      AND M.material_id = 52

) main
group by permit_id, month, material_id, material_name

<强>解释

由于您通过执行DISTINCT检索的结果被认为是真实的源代码,因此我通过将其作为子查询来创建内存表。但是,此子查询必须具有某种名称......无论名称如何。我给它起了一个名字main。子查询如下所示:

select ... from (sub-query) <give-it-a-table-name>

Simple Example:
select * from (select userid, username from user) user_temp

Advanced Example:
select * from (select userid, username from user) user_temp
inner join (select userid, sum(debits) as totaldebits from debittable) debit
    on debit.userid = user_temp.userid

注意如何使用子查询的user_temp别名,就像子查询是真实表一样。

答案 1 :(得分:2)

在子查询中使用上述查询并按(月)分组并选择总和(POC_emissions)和总和(NON_POC_emissions)