在 SQL Server 2008 中使用条件聚合
Using Conditional Aggregate in SQL Server 2008
我有一个包含太多 select 语句的查询。因此我使用了条件聚合。查询引用 Instock table 中 SQL Server 2008 中的数据,最终查询如下所示:
select
SUM(CASE WHEN MONTH = '2013-8-1' THEN CurrentStock ELSE 0 END) as CurrentStock,
Isnull(Sum(CASE WHEN MONTH = '2014-2-1' THEN CPU ELSE 0 END), 0) - Isnull(Sum(CASE WHEN MONTH = '2013-8-1' THEN CPU ELSE 0 END), 0) as CPU,
SUM(CASE WHEN Month = '2013-8-1' THEN NonCPUWIP ELSE 0 END) as NonCPU,
Isnull(Sum(CASE WHEN MONTH = '2014-2-1' THEN ScrapDiscarded ELSE 0 END), 0) - Isnull(Sum(CASE WHEN MONTH = '2013-8-1' THEN ScrapDiscarded ELSE 0 END), 0) as Scrap,
SUM(CASE WHEN Month = '2013-8-1' THEN WaitingForApproval ELSE 0 END) as WFA
from
Instock
where
Vendor = 'abc'
问题是需要包含的最后一个查询。它从 OutStock
table 获取数据,但我想在上面的查询中包含该查询,以便它 returns 作为单行结果。我能够使用嵌套查询满足要求,但我希望使用 条件聚合 获得相同的结果以实现数据库性能平滑。
需要包含的查询是:
select
COUNT(Product) as Despatched
from
OutStock
where
DispatchDate between '2013-8-1' and '2014-2-1'
and Vendor = 'abc'`
所以将两者结合起来我想作为一个查询执行,它将 return 一行
只需将第二个查询添加到第一个查询的列列表中,因为它只会 return 一行。试试这个。
SELECT Sum(CASE
WHEN MONTH = '2013-8-1' THEN CurrentStock
ELSE 0
END) AS CurrentStock,
Isnull(Sum(CASE WHEN MONTH = '2014-2-1' THEN CPU ELSE 0 END), 0) -
Isnull(Sum(CASE WHEN MONTH = '2013-8-1' THEN CPU ELSE 0 END), 0) AS CPU,
Sum(CASE WHEN Month = '2013-8-1' THEN NonCPUWIP ELSE 0 END) AS NonCPU,
Isnull(Sum(CASE WHEN MONTH = '2014-2-1' THEN ScrapDiscarded ELSE 0 END), 0) -
Isnull(Sum(CASE WHEN MONTH = '2013-8-1' THEN ScrapDiscarded ELSE 0 END), 0)AS Scrap,
Sum(CASE WHEN Month = '2013-8-1' THEN WaitingForApproval ELSE 0 END) AS WFA,
(SELECT Count(STBSerialNUMBER)
FROM OutStock
WHERE DispatchDate BETWEEN '2013-8-1' AND '2014-2-1'
AND Vendor = 'abc' ) as Despatched
FROM Instock I
WHERE Vendor = 'abc'
更新:
如果您想要每个模型的结果计数,请将 subquery
转换为 correlated subquery
。应该是这样的
(SELECT Count(STBSerialNUMBER)
FROM OutStock O
WHERE o.model = i.model -- here is the change
AND O.DispatchDate BETWEEN '2013-8-1' AND '2014-2-1'
AND o.Vendor = 'abc')
此处对于 Instock
table 中的每个 model
,将计算 outstock
中的相应 count
。
或者您也可以使用Left Join
。先计算Outstock
tablejoin
中每个model
的个数,结果返回给Instock
table使用模型
....
From Instock I Left Join
(SELECT Count(STBSerialNUMBER) OutStock_count,Model
FROM OutStock O
WHERE O.DispatchDate BETWEEN '2013-8-1' AND '2014-2-1'
AND o.Vendor = 'abc'
Group by Model) O on o.model = i.model
我有一个包含太多 select 语句的查询。因此我使用了条件聚合。查询引用 Instock table 中 SQL Server 2008 中的数据,最终查询如下所示:
select
SUM(CASE WHEN MONTH = '2013-8-1' THEN CurrentStock ELSE 0 END) as CurrentStock,
Isnull(Sum(CASE WHEN MONTH = '2014-2-1' THEN CPU ELSE 0 END), 0) - Isnull(Sum(CASE WHEN MONTH = '2013-8-1' THEN CPU ELSE 0 END), 0) as CPU,
SUM(CASE WHEN Month = '2013-8-1' THEN NonCPUWIP ELSE 0 END) as NonCPU,
Isnull(Sum(CASE WHEN MONTH = '2014-2-1' THEN ScrapDiscarded ELSE 0 END), 0) - Isnull(Sum(CASE WHEN MONTH = '2013-8-1' THEN ScrapDiscarded ELSE 0 END), 0) as Scrap,
SUM(CASE WHEN Month = '2013-8-1' THEN WaitingForApproval ELSE 0 END) as WFA
from
Instock
where
Vendor = 'abc'
问题是需要包含的最后一个查询。它从 OutStock
table 获取数据,但我想在上面的查询中包含该查询,以便它 returns 作为单行结果。我能够使用嵌套查询满足要求,但我希望使用 条件聚合 获得相同的结果以实现数据库性能平滑。
需要包含的查询是:
select
COUNT(Product) as Despatched
from
OutStock
where
DispatchDate between '2013-8-1' and '2014-2-1'
and Vendor = 'abc'`
所以将两者结合起来我想作为一个查询执行,它将 return 一行
只需将第二个查询添加到第一个查询的列列表中,因为它只会 return 一行。试试这个。
SELECT Sum(CASE
WHEN MONTH = '2013-8-1' THEN CurrentStock
ELSE 0
END) AS CurrentStock,
Isnull(Sum(CASE WHEN MONTH = '2014-2-1' THEN CPU ELSE 0 END), 0) -
Isnull(Sum(CASE WHEN MONTH = '2013-8-1' THEN CPU ELSE 0 END), 0) AS CPU,
Sum(CASE WHEN Month = '2013-8-1' THEN NonCPUWIP ELSE 0 END) AS NonCPU,
Isnull(Sum(CASE WHEN MONTH = '2014-2-1' THEN ScrapDiscarded ELSE 0 END), 0) -
Isnull(Sum(CASE WHEN MONTH = '2013-8-1' THEN ScrapDiscarded ELSE 0 END), 0)AS Scrap,
Sum(CASE WHEN Month = '2013-8-1' THEN WaitingForApproval ELSE 0 END) AS WFA,
(SELECT Count(STBSerialNUMBER)
FROM OutStock
WHERE DispatchDate BETWEEN '2013-8-1' AND '2014-2-1'
AND Vendor = 'abc' ) as Despatched
FROM Instock I
WHERE Vendor = 'abc'
更新:
如果您想要每个模型的结果计数,请将 subquery
转换为 correlated subquery
。应该是这样的
(SELECT Count(STBSerialNUMBER)
FROM OutStock O
WHERE o.model = i.model -- here is the change
AND O.DispatchDate BETWEEN '2013-8-1' AND '2014-2-1'
AND o.Vendor = 'abc')
此处对于 Instock
table 中的每个 model
,将计算 outstock
中的相应 count
。
或者您也可以使用Left Join
。先计算Outstock
tablejoin
中每个model
的个数,结果返回给Instock
table使用模型
....
From Instock I Left Join
(SELECT Count(STBSerialNUMBER) OutStock_count,Model
FROM OutStock O
WHERE O.DispatchDate BETWEEN '2013-8-1' AND '2014-2-1'
AND o.Vendor = 'abc'
Group by Model) O on o.model = i.model