在单(大)SQL查询语法中使用CASE语句作为COUNT函数的前身

时间:2011-06-02 15:39:08

标签: sql sql-server sql-server-2005 reporting-services report-designer

我无法在大型SQL查询中加入一些逻辑。我正在将SQL Server Reporting Services 2005与报表设计器一起使用,它只为您提供了一个区域来定义用于填充报表的单个SQL查询。希望有人可以告诉我我的语法有什么问题所以我可以让它运行。

我不仅要选择一堆属性过滤(QuoteOrderStatus!='Closed'),还要在COUNT(DISTINCT ItemID)语句中仅计算带(ItemStatus!='inactive')的引号(聚合函数)。我不想简单地过滤掉非活动项目的引号,因为我仍然希望显示带有零项的引号。我只想将它们包含在itemCount中。

我做了研究,似乎完成这种逻辑的方法是使用CASE语句,但是我很难将它们合并到这个混淆的查询中。报表设计器只是告诉我这是错误的,并将其重新排列为我想要的更少的方式。任何人都可以帮我修复这个语句,以便它被接受为有效的查询吗?

我已经研究了几个小时,但没有找到适合这种特定问题的好资源。对不起,如果代码不清楚,我尽力解释这个问题。如果您希望我以某种方式澄清,请提出问题,我感谢任何人提供的任何帮助。

SELECT DISTINCT 
    BIAdmin.Quote.QuoteOrderSalesOffice, BIAdmin.Quote.ManufacturerQuoteNumber, 
    BIAdmin.Quote.CustomerName, BIAdmin.Quote.Project_JobTitle, 
    BIAdmin.Quote.EndUserName, BIAdmin.Quote.QuoteOrderStatus,
    SUM(BIAdmin.Item.TotalPriceOfItemNumber) AS totalValue, BIAdmin.Item.ItemStatus
FROM BIAdmin.Quote LEFT OUTER JOIN BIAdmin.Item ON BIAdmin.Quote.ID = BIAdmin.Item.QuoteID
WHERE   BIAdmin.Item.ItemStatus LIKE
    CASE WHEN NOT (BIAdmin.Item.ItemStatus = 'inactive') THEN
    SELECT DISTINCT COUNT(BIAdmin.Item.ID) AS itemCount
GROUP BY BIAdmin.Quote.QuoteOrderSalesOffice, BIAdmin.Quote.ManufacturerQuoteNumber,
    BIAdmin.Quote.CustomerName, BIAdmin.Quote.Project_JobTitle,
    BIAdmin.Quote.EndUserName, BIAdmin.Quote.QuoteOrderStatus, BIAdmin.Item.ItemStatus
HAVING (NOT (BIAdmin.Quote.QuoteOrderStatus = N'[Closed]'))

3 个答案:

答案 0 :(得分:2)

我没有试图解开你的整个陈述,但听起来你想要像这样使用你的CASE语句:

SUM(CASE WHEN BIAdmin.Item.ItemStatus = 'inactive' THEN 0 ELSE 1 END) As ActiveItemCount

此语句将在您的select子句中而不是在where子句中。使用“喜欢”你不会工作的方式。尝试完全取出它(并在没有DISTINCT的情况下尝试一次)并添加上面的总和以查看结果的样子。

答案 1 :(得分:1)

CASE语句没有END,并且您的上一个SELECT在该上下文中无效。尝试这样的事情:

SELECT BIAdmin.Quote.QuoteOrderSalesOffice, BIAdmin.Quote.ManufacturerQuoteNumber, 
    BIAdmin.Quote.CustomerName, BIAdmin.Quote.Project_JobTitle, 
    BIAdmin.Quote.EndUserName, BIAdmin.Quote.QuoteOrderStatus,
    SUM(BIAdmin.Item.TotalPriceOfItemNumber) AS totalValue, BIAdmin.Item.ItemStatus,
    sum(case when BIAdmin.Item.ItemStatus != 'inactive' then 1 end) as NotInactiveCount,
    count(*) as TotalCount
FROM BIAdmin.Quote 
LEFT OUTER JOIN BIAdmin.Item ON BIAdmin.Quote.ID = BIAdmin.Item.QuoteID
GROUP BY BIAdmin.Quote.QuoteOrderSalesOffice, BIAdmin.Quote.ManufacturerQuoteNumber,
    BIAdmin.Quote.CustomerName, BIAdmin.Quote.Project_JobTitle,
    BIAdmin.Quote.EndUserName, BIAdmin.Quote.QuoteOrderStatus, BIAdmin.Item.ItemStatus
HAVING (NOT (BIAdmin.Quote.QuoteOrderStatus = N'[Closed]'))

答案 2 :(得分:0)

SELECT DISTINCT  BIAdmin.Item.ID,
    BIAdmin.Quote.QuoteOrderSalesOffice, BIAdmin.Quote.ManufacturerQuoteNumber, 
    BIAdmin.Quote.CustomerName, BIAdmin.Quote.Project_JobTitle, 
    BIAdmin.Quote.EndUserName, BIAdmin.Quote.QuoteOrderStatus,
    SUM(BIAdmin.Item.TotalPriceOfItemNumber) AS totalValue, BIAdmin.Item.ItemStatus,
    SUM( ( case when BIAdmin.Item.ItemStatus = 'inactive' THEN 1 ELSE 0 END))
FROM BIAdmin.Quote LEFT OUTER JOIN BIAdmin.Item ON BIAdmin.Quote.ID = BIAdmin.Item.QuoteID

GROUP BY BIAdmin.Item.ID, BIAdmin.Quote.QuoteOrderSalesOffice, BIAdmin.Quote.ManufacturerQuoteNumber,
    BIAdmin.Quote.CustomerName, BIAdmin.Quote.Project_JobTitle,
    BIAdmin.Quote.EndUserName, BIAdmin.Quote.QuoteOrderStatus, BIAdmin.Item.ItemStatus
HAVING (NOT (BIAdmin.Quote.QuoteOrderStatus = N'[Closed]'))