1

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

我不仅需要选择一组按 (QuoteOrderStatus != 'Closed') 过滤的属性,而且还需要在 COUNT(DISTINCT ItemID's) 语句(聚合函数)中只计算带有 (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]'))
4

3 回答 3

2

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

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

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

于 2011-06-02T15:54:46.280 回答
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]'))
于 2011-06-02T15:43:37.503 回答
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]'))
于 2011-06-02T16:57:27.890 回答