如何找出一列相对于另一列最大值和最小值的总和



我使用过 DB2,我刚刚迁移到 SQL Server。我对查询有点困惑。

假设我有这样的表数据

StoreID | Sales
A    |  23
B    |  50
B    |  50

在此带有存储过程参数的数据中,我想汇总 Sales 的总和。我将获得 StoreID 的参数,但在此参数中我也可以获得"ALL"。

在DB2 中,我可以使用存储过程(在名为 ParameterStore 的参数中具有 StoreID)获取所有数据,查询如下

if(ParameterStore= 'ALL') Then
Set Loc_min = X'00';
Set Loc_max = X'FF';
ELSE
Set Loc_min = ParameterStore;
Set Loc_max = ParameterStore;
END if;
Select Sum(Sales) From Store_data where StoreID between Loc_min and Loc_max;

如何在 SQL Server 中执行此操作以获得相同的结果?

您可以检查该值是 ALL 还是OR中的其他值:

DECLARE @store_id VARCHAR(20) -- or whatever length you have
SET @store_id = 'XYZ'
select sum(sales)
from store_data
where @store_id = 'ALL' or store_id = @store_id;

IF的T-SQL语法略有不同。你可以像这样使用它:

/*
DECLARE @ParameterStore VARCHAR(10);
DECLARE @Loc_min INT;
DECLARE @Loc_max INT;
*/
IF @ParameterStore = 'ALL'
BEGIN
Set @Loc_min = 0x00;
Set @Loc_max = 0xFF;
END
ELSE
BEGIN
Set @Loc_min = @ParameterStore;
Set @Loc_max = @ParameterStore;
END;

话虽如此,您尝试实现的目标可以按如下方式完成:

-- DECLARE @ParameterStore VARCHAR(10);
SELECT SUM(Sales)
FROM Store_data
WHERE CASE
WHEN @ParameterStore = 'ALL' THEN -1
WHEN @ParameterStore = StoreID THEN -1
END = -1  

如果您需要十六进制比较,请尝试此操作。

DECLARE
@ParameterStore VARCHAR(10)
SET @ParameterStore = 'ALL'
SELECT SUM(Sales)
FROM Store_data
WHERE StoreID BETWEEN (
CASE
WHEN @ParameterStore = 'ALL'
THEN 0x00
ELSE @ParameterStore
END)
AND (
CASE
WHEN @ParameterStore = 'ALL'
THEN 0xFF
ELSE @ParameterStore
END ) ;

演示

最新更新