具有不同日期的子查询SUM

时间:2014-07-13 22:25:37

标签: mysql sql

我检索两个值的总和:

SUM (CASE WHEN CAUSALI.AVAILABLECAUSA_1 LIKE ('%CAUSE-1%')  THEN (mtscrap) ELSE 0 END ) as Cause1

SUM (CASE WHEN CAUSALI.AVAILABLECAUSA_1 LIKE ('%CAUSE-2%')  THEN (mtscrap) ELSE 0 END ) as Cause2

我想设置另一个没有%CAUSE-*的SUM语句,并且WHERE子句独立于主体WHERE。我曾经使用过这个子查询:

(CASE WHEN day BETWEEN '2014-01-09' AND '2014-06-13' THEN SUM(MTSCRAP) ELSE 0 END) AS XXXXXX

但我的数据错误。我的全局查询是:

    SELECT
      SezioneID
    , Desc_Prod
    , sample.products.VETTURA AS VetturaID
    , truncate((SUM(mtscrap_1) / SUM(MtProdotti_1)) * 100, 2) AS Scrap_1
    , truncate((SUM(mtscrap_2) / SUM(MtProdotti_2)) * 100, 2) AS Scrap_2
    , mtscrap_1
    , MtProdotti_1
    , mtscrap_2
    , MtProdotti_2
FROM flB.flB_prod AS PROD
      JOIN SAMPLE.PRODUCTS
                  ON (sample.products.SKU = PROD.SEZIONEID)
                        AND (sample.products.LINEA = 'FLB')
      JOIN (
                  SELECT
                        IDSEZIONE
                      , IDTURNO
                      , ID_PROG
                      , SUM(CASE
                              WHEN AVAILABLECAUSA_1 LIKE ('%CHANGE-1%') THEN mtscrap ELSE 0
                            END) AS mtscrap_1
                      , SUM(CASE
                              WHEN AVAILABLECAUSA_1 LIKE ('%CHANGE-1%') THEN MtProdotti ELSE 0
                            END) AS MtProdotti_1
                      , SUM(CASE
                              WHEN AVAILABLECAUSA_1 LIKE ('%CHANGE-2%') THEN mtscrap ELSE 0
                            END) AS mtscrap_2
                      , SUM(CASE
                              WHEN AVAILABLECAUSA_1 LIKE ('%CHANGE-2%') THEN  MtProdotti ELSE 0
                        END) AS MtProdotti_2
                            , MtProdotti
                  FROM FLB.flB_causali
                  WHERE DATASTARTPRG BETWEEN '2014-06-09' AND '2014-06-13'
                  GROUP BY
                        IDSEZIONE
                        IDTURNO
                      , ID_PROG
            ) AS CAUSALI
                  ON (PROD.SEZIONEID = CAUSALI.IDSEZIONE)
                        AND PROD.TURNO = CAUSALI.IDTURNO
                        AND PROD.ID_PROG = CAUSALI.ID_PROG
WHERE giorno BETWEEN '2014-06-09' AND '2014-06-13'
GROUP BY
      SezioneID

我需要这个观点:Required fields

2 个答案:

答案 0 :(得分:1)

我尽力在 EVERY 字段引用旁边添加一个表或别名。在这一点上,我真的不知道我还能为你做些什么。我不认为任何更多的话会有所帮助。

这两个简单的项目将有所帮助: 1.样本数据 2.预期结果


因为你没有在原始查询中的所有字段上使用表别名 以下是一个完整的猜测,但在原始查询中使用DISTINCT的存在是过多的行"这表明需要在整体查询之前进行分组。所以,这是我的第一个猜测:

SELECT
      PROD.SezioneID
    , PROD.Desc_Prod
    , sample.products.VETTURA AS VetturaID
    , truncate((SUM(CAUSALI.mtscrap_1) / SUM(CAUSALI.MtProdotti_1)) * 100, 2) AS Scrap_1
    , truncate((SUM(CAUSALI.mtscrap_2) / SUM(CAUSALI.MtProdotti_2)) * 100, 2) AS Scrap_2
    , CAUSALI.mtscrap_1
    , CAUSALI.MtProdotti_1
    , CAUSALI.mtscrap_2
    , CAUSALI.MtProdotti_2
FROM flB.flB_prod AS PROD
      JOIN SAMPLE.PRODUCTS
                  ON (sample.products.SKU = PROD.SEZIONEID)
                        AND (sample.products.LINEA = 'FLB')
      JOIN (
                  SELECT
                        flB_causali.IDSEZIONE
                      , flB_causali.IDTURNO
                      , flB_causali.ID_PROG
                      , SUM(CASE
                              WHEN flB_causali.AVAILABLECAUSA_1 LIKE ('%CHANGE-1%') THEN flB_causali.mtscrap ELSE 0
                            END) AS mtscrap_1
                      , SUM(CASE
                              WHEN flB_causali.AVAILABLECAUSA_1 LIKE ('%CHANGE-1%') THEN flB_causali.MtProdotti ELSE 0
                            END) AS MtProdotti_1
                      , SUM(CASE
                              WHEN flB_causali.AVAILABLECAUSA_1 LIKE ('%CHANGE-2%') THEN flB_causali.mtscrap ELSE 0
                            END) AS mtscrap_2
                      , SUM(CASE
                              WHEN flB_causali.AVAILABLECAUSA_1 LIKE ('%CHANGE-2%') THEN  flB_causali.MtProdotti ELSE 0
                        END) AS MtProdotti_2
                            , flB_causali.MtProdotti
                  FROM FLB.flB_causali
                  WHERE flB_causali.DATASTARTPRG BETWEEN '2014-06-09' AND '2014-06-13'
                  GROUP BY
                        flB_causali.IDSEZIONE
                        flB_causali.IDTURNO
                      , flB_causali.ID_PROG
            ) AS CAUSALI
                  ON (PROD.SEZIONEID = CAUSALI.IDSEZIONE)
                        AND PROD.TURNO = CAUSALI.IDTURNO
                        AND PROD.ID_PROG = CAUSALI.ID_PROG
WHERE PROD.giorno BETWEEN '2014-06-09' AND '2014-06-13'
GROUP BY
      PROD.SezioneID
;

答案 1 :(得分:0)

你在找这个表达吗?

SUM(CASE WHEN day BETWEEN '2014-01-09' AND '2014-06-13' THEN MTSCRAP ELSE 0 END) AS XXXXXX

CASE进入SUM()进行条件聚合。