所以我有一个查询,可以进行多次求和,效果很好。以下是一个精简版。
select sum(Case when PLU='WIDG101' then qty else 0 end) as Widget1,
sum(Case when PLU='WIDG201' then qty else 0 end) as Widget2
from SalesTable
但是我有一个特定的PLUs列表,我想使用,可能需要不时更改。所以我声明了一些表,并像这样填充:
Declare @WidgetTable1 (Widget1s varchar(20))
Declare @WidgetTable2 (Widget2s varchar(20))
Insert into WidgetTable1 Values ('WIDG101'),('WIDG102'),('WIDG103')
Insert into WidgetTable2 Values ('WIDG201'),('WIDG202'),('WIDG203')
select sum(Case when PLU IN (Select * from @WidgetTable1) then qty else 0 end) as Widget1,
sum(Case when PLU IN (Select * from @WidgetTable2) then qty else 0 end) as Widget2
from SalesTable
但是我得到:不能对包含聚合或子查询的表达式执行聚合函数。我明白,但我被困在一个方法绕过它。
有什么建议吗?
可以使用右外连接而不是使用子查询:
select
sum(coalesce(s.qty,0)) Widget1, sum(coalesce(s.qty,0)) Widget2
from
SaleTable s
right outer join @WidgetTable1 w1
on s.PLU = w1.Widget1s
right outer join @WidgetTable2 w2
on s.PLU = w2.Widget2s
没有回答,但是我的回答太长了。
所以我试着这样做:
Declare @WidgetTable1 table (Widget1s varchar(20))
Declare @WidgetTable2 table (Widget2s varchar(20))
declare @Salestable table (PLU varchar(20),qty int)
Insert into @WidgetTable1 Values ('WIDG101'),('WIDG102'),('WIDG103')
Insert into @WidgetTable2 Values ('WIDG201'),('WIDG202'),('WIDG203')
Insert into @Salestable Values ('WIDG101',8),('WIDG202',10),('WIDG103',5)
select
sum(coalesce(s.qty,0)) Widget1, sum(coalesce(s.qty,0)) Widget2
from
@Salestable s
right outer join @WidgetTable1 w1
on s.PLU = w1.Widget1s
right outer join @WidgetTable2 w2
on s.PLU = w2.Widget2s
它使两列都为0。如果我只对w1表进行右连接,则查询"有效",因为它只对相关的PLUs求和,但仍然为两列提供相同的答案。所以你肯定是对的。我还在玩,但仍然需要一些额外的帮助。非常感谢你的努力!欢迎大家提出更多的意见。
随着截止日期的临近,我最终运行了2个查询并将它们组合在一起。