删除重复的结果CASE - UNION SELECT - Mysql

时间:2017-11-06 21:48:07

标签: mysql case union

我遇到重复结果的问题,我有一个大问题。

我正在尝试查询产品类型在一周内显示不同数量的问题,我遇到的问题是产品在同一记录中出现的两天都会重复,如下所示可以帮助我,我开始让我发疯。

SELECT formatopeso.tipo_formato,
    CASE
        when dia = '1'
        then sumatotal
        else ''
    END as Lunes,
    CASE
        when dia = '2'
        then sumatotal
        else ''
    END as Martes,
    CASE
        when dia = '3'
        then sumatotal
        else ''
    END as Miércoles,
    CASE
        when dia = '4'
        then sumatotal
        else ''
    END as Jueves,
    CASE
        when dia = '5'
        then sumatotal
        else ''
    END as Viernes,
    CASE
        when dia = '6'
        then sumatotal
        else ''
    END as Sábado
FROM (
   select '1' AS dia, pedidos.fecha_entrega, id_formatopeso, sum(pedidos.unidades) as sumatotal
   from pedidos
   where yearweek(fecha_entrega,1) = yearweek(now()) and weekday(fecha_entrega)= 0
UNION
   select '2' as dia, pedidos.fecha_entrega, id_formatopeso, sum(pedidos.unidades) as sumatotal
   from pedidos
   where yearweek(fecha_entrega,1) = yearweek(now()) and weekday(fecha_entrega)= 1
UNION
   select '3' as dia, pedidos.fecha_entrega, id_formatopeso, sum(pedidos.unidades) as sumatotal
   from pedidos
   where yearweek(fecha_entrega,1) = yearweek(now()) and weekday(fecha_entrega)= 2
UNION
   select '4' as dia, pedidos.fecha_entrega, id_formatopeso, sum(pedidos.unidades) as sumatotal
   from pedidos
   where yearweek(fecha_entrega,1) = yearweek(now()) and weekday(fecha_entrega)= 3
UNION
   select '5' as dia, pedidos.fecha_entrega, id_formatopeso, sum(pedidos.unidades) as sumatotal
   from pedidos
   where yearweek(fecha_entrega,1) = yearweek(now()) and weekday(fecha_entrega)= 4
UNION
   select '6' as dia, pedidos.fecha_entrega, id_formatopeso, sum(pedidos.unidades) as sumatotal
   from pedidos
   where yearweek(fecha_entrega,1) = yearweek(now()) and weekday(fecha_entrega)= 5)
pedidos INNER JOIN formatopeso 
ON     formatopeso.id_formatopeso = pedidos.id_formatopeso
GROUP BY pedidos.id_formatopeso, fecha_entrega;

我有这个结果:

+--------------+-------+--------+-----------+--------+---------+--------+
| tipo_formato | Lunes | Martes | Miércoles | Jueves | Viernes | Sábado |
+--------------+-------+--------+-----------+--------+---------+--------+
| 22Ø 180gr    |       | 450    |           |        |         |        |
| 22Ø 180gr    |       |        | 100       |        |         |        |
| 27Ø 270gr    |       |        |           | 200    |         |        |
| 27Ø 270gr    |       |        |           |        | 300     |        |
+--------------+-------+--------+-----------+--------+---------+--------+

我需要得到这样的结果:

+--------------+-------+--------+-----------+--------+---------+--------+
| tipo_formato | Lunes | Martes | Miércoles | Jueves | Viernes | Sábado |
+--------------+-------+--------+-----------+--------+---------+--------+
| 22Ø 180gr    |       | 450    |  100      |        |         |        |
| 27Ø 270gr    |       |        |           |  200   | 300     |        |
+--------------+-------+--------+-----------+--------+---------+--------+

1 个答案:

答案 0 :(得分:0)

您需要按tipo_formato分组,并总结给定tipo_formato值的每周每一天的计数。

您当前的查询还有一些额外的复杂性,并非真正必要。您可以删除子查询,只需更改CASE语句即可启用weekday(pedidos.fecha_entrega)

我还建议您启用ONLY_FULL_GROUP_BY sql_mode以避免SELECT子句与GROUP BY子句不匹配的问题。您详细了解了here

我不确定你的表有多大,但你也可以通过索引yearweek(pedidos.fecha_entrega,1) = yearweek(now())列并重写查询以避免包裹pedidos.fecha_entrega来提高pedidos.fecha_entrega的性能。在函数调用中。那不是你真的 重新询问,所以我不会触及查询的那一部分,但是如果表格一直都很大,那就值得考虑。

此查询应该适合您:

SELECT formatopeso.tipo_formato,
      SUM(CASE
          when weekday(pedidos.fecha_entrega)= 0
          then pedidos.unidades
          else NULL
      END) as Lunes,
      SUM(CASE
          when weekday(pedidos.fecha_entrega)= 1
          then pedidos.unidades
          else NULL
      END) as Martes,
      SUM(CASE
          when weekday(pedidos.fecha_entrega)= 2
          then pedidos.unidades
          else NULL
      END) as Miércoles,
      SUM(CASE
          when weekday(pedidos.fecha_entrega)= 3
          then pedidos.unidades
          else NULL
      END) as Jueves,
      SUM(CASE
          when weekday(pedidos.fecha_entrega)= 4
          then pedidos.unidades
          else NULL
      END) as Viernes,
      SUM(CASE
          when weekday(pedidos.fecha_entrega)= 5
          then pedidos.unidades
          else NULL
      END) as Sábado
  FROM  pedidos
   INNER JOIN formatopeso
  ON     formatopeso.id_formatopeso = pedidos.id_formatopeso
  where yearweek(pedidos.fecha_entrega,1) = yearweek(now()) 
  GROUP BY formatopeso.tipo_formato