SQL选择所有记录或特定记录

时间:2018-08-01 08:46:44

标签: sql-server

提供表格

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子句的一部分视为不等于,但那里不允许有多个位置。

3 个答案:

答案 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);