使用子查询执行多个和查询

  • 本文关键字:查询 执行 sql
  • 更新时间 :
  • 英文 :


所以我有一个查询,可以进行多次求和,效果很好。以下是一个精简版。

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个查询并将它们组合在一起。

相关内容

  • 没有找到相关文章

最新更新