MySql union Sum(Case())

时间:2017-06-25 22:46:30

标签: mysql sql

如何为“ACTIVITY”字段仅获取不同的值来执行“联合”,但是在标题中出现“OUTPUT_AB”中的“OUTPUT_”启动的变量。 (与“INPUT_TAB”中的“INPUT_”变量相似)。

有可能吗?我不能这样做。

检查我的查询PIC_QUERY

SELECT 
  ACTIVIDADE, 
  SUM(CASE WHEN DATA_VAL_REGISTO = '2017-06-25' THEN 1 ELSE 0 END) INPUT_ACT_DATE_VOL, 
  SUM(CASE WHEN DATA_VAL_REGISTO = '2017-06-24' THEN 1 ELSE 0 END) PREV_DATE_VOL, 
  SUM(CASE WHEN WEEK(DATA_VAL_REGISTO,7) = '25' AND YEAR(DATA_VAL_REGISTO) = '2017' THEN 1 ELSE 0 END) INPUT_ACT_WEEK_VOL,
  SUM(CASE WHEN WEEK(DATA_VAL_REGISTO,7) = '24' AND YEAR(DATA_VAL_REGISTO) = '2017' THEN 1 ELSE 0 END) INPUT_PREV_WEEK_VOL, 
  SUM(CASE WHEN MONTH(DATA_VAL_REGISTO) = '6' AND YEAR(DATA_VAL_REGISTO) = '2017' THEN 1 ELSE 0 END) INPUT_ACT_MONTH_VOL, 
  SUM(CASE WHEN MONTH(DATA_VAL_REGISTO) = '5' AND YEAR(DATA_VAL_REGISTO) = '2017' THEN 1 ELSE 0 END) INPUT_PREV_MONTH_VOL
FROM INPUT_TAB 
GROUP BY ACTIVIDADE

UNION 

SELECT 
  ACTIVIDADE, 
  SUM(CASE WHEN DATA_FIM_REP = '2017-06-25' THEN 1 ELSE 0 END) OUTPUT_ACT_DATE_VOL, 
  SUM(CASE WHEN DATA_FIM_REP = '2017-06-24' THEN 1 ELSE 0 END) OUTPUT_PREV_DATE_VOL, 
  SUM(CASE WHEN WEEK(DATA_FIM_REP,7) = '25' AND YEAR(DATA_FIM_REP) = '2017' THEN 1 ELSE 0 END) OUTPUT_ACT_WEEK_VOL, 
  SUM(CASE WHEN WEEK(DATA_FIM_REP,7) = '24' AND YEAR(DATA_FIM_REP) = '2017' THEN 1 ELSE 0 END) OUTPUT_PREV_WEEK_VOL, 
  SUM(CASE WHEN MONTH(DATA_FIM_REP) = '6' AND YEAR(DATA_FIM_REP) = '2017' THEN 1 ELSE 0 END) OUTPUT_ACT_MONTH_VOL, 
  SUM(CASE WHEN MONTH(DATA_FIM_REP) = '5' AND YEAR(DATA_FIM_REP) = '2017' THEN 1 ELSE 0 END) OUTPUT_PREV_MONTH_VOL 
FROM OUTPUT_TAB 
GROUP BY ACTIVIDADE

结果:PIC_RESULT

1 个答案:

答案 0 :(得分:1)

您不希望两个查询结果的联合,但加入

SELECT 
  actividade, 
  i.input_act_date_vol, i.input_prev_date_vol, i.input_act_week_vol,
  i.input_prev_week_vol, i.input_act_month_vol, i.input_prev_month_vol,
  o.output_act_date_vol, o.output_prev_date_vol, o.output_act_week_vol, 
  o.output_prev_week_vol, o.output_act_month_vol, o.output_prev_month_vol 
FROM 
(
  SELECT 
    actividade, 
    SUM(data_val_registo = '2017-06-25') AS input_act_date_vol, 
    SUM(data_val_registo = '2017-06-24') AS input_prev_date_vol, 
    SUM(WEEK(data_val_registo, 7) = 25 AND YEAR(data_val_registo) = 2017) AS input_act_week_vol,
    SUM(WEEK(data_val_registo, 7) = 24 AND YEAR(data_val_registo) = 2017) AS input_prev_week_vol, 
    SUM(MONTH(data_val_registo) = 6 AND YEAR(data_val_registo) = 2017) AS input_act_month_vol, 
    SUM(MONTH(data_val_registo) = 5 AND YEAR(data_val_registo) = 2017) AS input_prev_month_vol
  FROM input_tab
  GROUP BY actividade
) i
JOIN
(
  SELECT 
    actividade, 
    SUM(data_fim_rep = '2017-06-25') AS output_act_date_vol, 
    SUM(data_fim_rep = '2017-06-24') AS output_prev_date_vol, 
    SUM(WEEK(data_fim_rep, 7) = 25 AND YEAR(data_fim_rep) = 2017) AS output_act_week_vol, 
    SUM(WEEK(data_fim_rep, 7) = 24 AND YEAR(data_fim_rep) = 2017) AS output_prev_week_vol, 
    SUM(MONTH(data_fim_rep) = 6 AND YEAR(data_fim_rep) = 2017) AS output_act_month_vol, 
    SUM(MONTH(data_fim_rep) = 5 AND YEAR(data_fim_rep) = 2017) ASoutput_prev_month_vol 
  FROM OUTPUT_TAB 
  GROUP BY actividade
) o USING (actividade);

如果可以输入没有输出,反之亦然,那么你必须使用外连接。如果在没有输入的情况下甚至可以同时输入没有输出和输出,你将不得不查找如何模拟MySQL中的完整外连接。

我已删除CASE WHEN .. THEN 1 ELSE 0 END,因为布尔表达式会导致true或false,在MySQL中等于1和0.

BTW:由于这完全是关于2017年,您可以使用WHERE YEAR(data_val_registo)WHERE YEAR(data_fim_rep) = 2017并从总和表达式中删除条件,从而使查询更简单,更快捷。