我遇到重复结果的问题,我有一个大问题。
我正在尝试查询产品类型在一周内显示不同数量的问题,我遇到的问题是产品在同一记录中出现的两天都会重复,如下所示可以帮助我,我开始让我发疯。
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 | |
+--------------+-------+--------+-----------+--------+---------+--------+
答案 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