1

大規模な SQL クエリに少しのロジックを組み込むのに問題があります。レポート デザイナで SQL Server Reporting Services 2005 を使用していますが、レポートに入力する単一の SQL クエリを定義する領域が 1 つしかありません。うまくいけば、誰かが私の構文の何が問題なのか教えてくれるので、実行できるようになります。

(QuoteOrderStatus != 'Closed') でフィルタリングする一連の属性を選択するだけでなく、COUNT(DISTINCT ItemID's) ステートメント (集計関数) で (ItemStatus != 'inactive') を使用して見積もりをカウントするだけで済みます。 . 非アクティブなアイテムを含む見積もりを単純にフィルターで除外したくはありません。アイテムがゼロの見積もりを引き続き表示したいからです。それらを合計itemCountに含めたくないだけです。

私は調査を行い、このタイプのロジックを達成する方法は CASE ステートメントを使用しているようですが、この 1 つの難読化されたクエリにそれらを組み込むのに問題があります。Report Designer は単にそれが間違っていることを教えてくれ、私が望まない方法に再配置してくれます。有効なクエリとして受け入れられるように、このステートメントを修正するのを手伝ってくれる人はいますか?

この特定の種類の問題に対する適切なリソースを見つけることなく、これを何時間も調査しました。コードが不明確な場合は申し訳ありませんが、できる限り説明しようとしました。何らかの方法で明確にしたい場合は、質問してください。誰かが提供できる助けに感謝します.

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

このステートメントは、where 句ではなく select 句に含まれます。「いいね」の使い方はうまくいきません。それを完全に取り出して (DISTINCT なしで 1 回試して)、上記の合計を追加して、結果がどのようになるかを確認してください。

于 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 に答える