提供表格
period | location | value
1 1 100
1 1 50
1 2 100
1 3 100
2 1 100
2 2 100
2 3 100
是否可以编写单个sql命令来对所有位置和单个位置进行分组并返回期间信息?
例如
所有位置:
选择期间,表中按期间分组的总和(值)
返回
1, 350
2, 300
单个位置:
SELECT period
,sum(value)
FROM TABLE
WHERE location = 1
GROUP BY period
返回
1, 150
2, 200
我想用一条sql命令结束,如果将0传递为位置,它将返回所有位置的总和,如果传递特定的位置,它将仅返回该位置。
我不想使用in()命令或在运行时更改命令,因为它会增加处理时间。实际的SQL非常复杂,使用in()会严重影响性能。
我尝试了一些逻辑操作,但无法正常工作。
虽然我也使用了联合,但仍不确定要过滤的命令是什么,另外这实际上是两个单独的SQL命令,这会增加处理开销。
我曾经考虑过将where子句的一部分视为不等于,但那里不允许有多个位置。
答案 0 :(得分:2)
这是您想要的吗?
select period, sum(value)
from table
where location = @location
or @location = 0
group by period
答案 1 :(得分:2)
尝试在WHERE子句中使用CASE条件
select period, sum(value)
from table
where location = CASE WHEN @location = 0 THEN location ELSE @location END
group by period
答案 2 :(得分:0)
您可以为此问题创建一个简单的存储过程。 使用参数pLocation创建一个SP,然后使用适当的选择值调用该SP。 这是一个带有MySQL代码的示例。
BEGIN
/* Parameter : IN pLocation VARCHAR(1) */
SET @ssql = CONCAT("SELECT period, SUM(value)");
SET @sqlwhere01 = CONCAT("WHERE 1 = 1 ");
SET @sqlgroupby = CONCAT("GROUP BY period)
IF pLocation = 0 THEN
SET @sqlwhere02 = "";
ELSE
SET @sqlwhere02 = CONCAT("AND location = ",pLocation);
ENDIF
SET @ssqlexecute = CONCAT(@ssql,@sqlwhere01,@sqlwhere02,@sqlgroupby);
PREPARE statement FROM @ssqlexecute;
EXECUTE statement;
DEALLOCATE PREPARE statement;
END
要运行存储过程,请将此命令放入代码中。
CALL sp_name(plocation);