2017-06-14 12 views
0

ケースステートメントで重複しています。ケースステートメントからの冗長行とSQLサーバーへの結合

サブクエリを使用しないでこれを回避するにはどうすればよいですか?

SELECT 

    [S].[TicketNbr] AS 'Ticket Nbr' 
, [S].[status_description] AS 'Status' 
, (CASE WHEN [A].OldValue_Text = 'Service Desk' THEN 1 ELSE 0 END) AS 'Moved from Old Board?' END) AS 'Moved from Old Board?' 

FROM [Service] AS [S] 
LEFT OUTER JOIN [Audit] AS [A] 
ON [A].[TicketNbr]=[S].[TicketNbr] 

GROUP BY [S].[TicketNbr] 
, [S].[status_description] 
,(CASE WHEN [A].OldValue_Text = 'Service Desk' THEN 1 ELSE 0 END) 

私は唯一の1

enter image description here

+1

distinctを追加することができますMoved from old Board?

のために1の値を持つ項目だけに設定し、あなたの結果をしています減少しますここで外部結合を使用しているはずですか?このクエリで何をしようとしていますか? – MBurnham

答えて

1

ものは、彼らがAuditの複数の行から生じた別のレコードをしている、重複していないと行をしたいノート - あなたの例では 'はOldValue_Textと1サービスデスク 'とそうでないものがあります。

  1. は、既存のクエリを維持し、あなたの3番目の列の最大を取る:

    あなただけそう1存在する場合と0を探しているなら

    さて、あなたは3つのいずれかを行うことができます

    :相関サブクエリ(私はあなたがいずれかを使用したくないと言う知っているが、これは有効な解決策である)と
    SELECT  
        [S].[TicketNbr] AS [Ticket Nbr], 
        [S].[status_description] AS [Status], 
        MAX((CASE WHEN [A].OldValue_Text = 'Service Desk' THEN 1 ELSE 0 END)) AS [Moved from Old Board?] 
    
    FROM [Service] AS [S] 
    LEFT OUTER JOIN [Audit] AS [A] 
        ON [A].[TicketNbr]=[S].[TicketNbr] 
    
    GROUP BY [S].[TicketNbr], 
        [S].[status_description] 
    
  2. 使用

    SELECT  
        [S].[TicketNbr] AS [Ticket Nbr], 
        [S].[status_description] AS [Status], 
        CASE WHEN EXISTS (SELECT 1 FROM [Audit] AS [A] 
        WHERE [A].[TicketNbr]=[S].[TicketNbr] 
        AND [A].OldValue_Text = 'Service Desk') THEN 1 ELSE 0 END AS [Moved from Old Board?] 
    
    FROM [Service] AS [S] 
    
  3. 代わりに条件OldValue_Text = 'Service Desk'を結合句に追加します。これにより、結合された行が後の行に縮小されます。 (なお、これは一致した一つだけの行があると仮定し、あなたはDISTINCTを追加する必要がありません場合):それはあなたの重複を与えないように

    SELECT  
        [S].[TicketNbr] AS [Ticket Nbr], 
        [S].[status_description] AS [Status], 
        CASE WHEN [A].[TicketNbr] IS NOT NULL THEN 1 ELSE 0 END AS [Moved from Old Board?] 
    
    FROM [Service] AS [S] 
    LEFT OUTER JOIN [Audit] AS [A] 
        ON [A].[TicketNbr]=[S].[TicketNbr] 
        AND [A].OldValue_Text = 'Service Desk' 
    
+0

複数のオプションを記載していただきありがとうございます! – Dombey

0

あなたのcase文は、SELECT句です。また、これらは重複ではなく、全く異なるレコードです。私はあなたが行う必要がありますすべては唯一の「サービスデスク」

WHERE [A].OldValue_Text LIKE 'Service Desk' 

あなたの句からではなく、あなたのグループの前にBY句の後にこれを追加するのOldValue_Textのレコードを引っ張るwhere句を追加していると信じています。

これはこれはあなたの重複を与えた場合、あなたは自分のselect句

SELECT DISTINCT 

     [S].[TicketNbr] AS 'Ticket Nbr' 
    , [S].[status_description] AS 'Status' 
    , (CASE WHEN [A].OldValue_Text = 'Service Desk' THEN 1 ELSE 0 END) AS 'Moved from Old Board?' END) AS 'Moved from Old Board?' 
関連する問題