0

私は、インターフェイスをSQLデータベースにリンクするケース管理システムを備えた法律事務所で働いています。レポートを実行するためにSSRSでクエリを作成しています。ケース情報のレポートを実行しようとしています。一部の情報は「cases」テーブル(またはvcasesビュー)にありますが、「demands_offers」テーブルの情報もリンクしようとしています。各ケースには複数のデマンドとオファーが含まれる可能性があるため、結合でMAX関数を使用して、ケースごとに最新のデマンドレコードのみを抽出しています。残念ながら、これを行うと、要求のないケースが排除されます。すべてのケースが表示される必要があります。

MAX関数にネストされたCASEステートメントを使用して、NULLまたは空のフィールドをランダムな初期の日付に変換しようとしましたが、それでもすべてのケースをレポートに表示することはできません。

何か案は?私はSQLの比較的初心者であり、正式なトレーニングを受けていません。どんな助けでも大歓迎です。以下のコードを見ることができます。(PS私には一時テーブルを作成する権利があるとは思いません。)

SELECT vc.case_number AS "Matter ID", vc.style, vc.atty2_name AS "Handling Attorney", m.max_demands_date, do.demands, do.demands_notes, sa.authorized,      
(SELECT TOP 1 vl.computename        
FROM vcases vca     
LEFT OUTER JOIN case_parties cp     
ON vca.case_sk = cp.case_sk     
JOIN case_parties cpp       
ON cp.parent_sk = cpp.case_parties_sk       
JOIN vlegal_entity vl       
ON vl.legal_entity_sk = cp.entity_sk        
JOIN vlegal_entity vlp      
ON vlp.legal_entity_sk = cpp.entity_sk      
WHERE (vca.case_sk = vc.case_sk) AND (cpp.role_sk = '3557') AND (cp.role_sk = '3986') ) AS "Plaintiff//'s Attorney",        
(SELECT cp.reference_number     
    FROM cases AS ca    
        LEFT OUTER JOIN case_parties AS cp
        ON ca.case_sk = cp.case_sk
    WHERE (cp.role_sk = '3706')     
        AND (ca.case_sk = vc.case_sk)) AS "Claim Number"


FROM        
vcases vc       
LEFT OUTER JOIN     
case_parties cp ON vc.case_sk = cp.case_sk      
LEFT OUTER JOIN     
vlegal_entity vl ON cp.entity_sk = vl.legal_entity_sk       
LEFT OUTER JOIN     
settle_authority sa ON vc.case_sk = sa.case_sk      
LEFT OUTER JOIN         
demands_offers do ON vc.case_sk = do.case_sk        

INNER JOIN      
 (SELECT DISTINCT max(
(CASE WHEN do.demands_date = '' THEN '1/1/1900 00:00:00'
             ELSE do.demands_date
              END)
  ) as "max_demands_date", vc.case_sk       
   FROM vcases AS vc        
   JOIN demands_offers AS do ON vc.case_sk = do.case_sk     
   GROUP BY vc.case_sk) AS m        
  ON vc.case_sk = m.case_sk  AND        
  do.demands_date = m.max_demands_date      

WHERE (vc.closed_ind = 'O') AND (cp.role_sk = '3816') AND (vl.client_number = 'EAS-01') AND (vc.lawtype_code <> 'FA')       
ORDER BY vc.case_number 
4

1 に答える 1

1

クエリはおそらくはるかにコンパクトでパフォーマンスが向上するように記述できますが、最初に、これは要求なしに行を削除する部分です。

INNER JOIN      
 (SELECT DISTINCT max(
(CASE WHEN do.demands_date = '' THEN '1/1/1900 00:00:00'
             ELSE do.demands_date
              END)
  ) as "max_demands_date", vc.case_sk       
   FROM vcases AS vc        
   JOIN demands_offers AS do ON vc.case_sk = do.case_sk     
   GROUP BY vc.case_sk) AS m        
  ON vc.case_sk = m.case_sk  AND        
  do.demands_date = m.max_demands_date 

それはする必要があります

LEFT JOIN      
 (SELECT DISTINCT max(
(CASE WHEN do.demands_date = '' THEN '1/1/1900 00:00:00'
             ELSE do.demands_date
              END)
  ) as "max_demands_date", vc.case_sk       
   FROM vcases AS vc        
   JOIN demands_offers AS do ON vc.case_sk = do.case_sk     
   GROUP BY vc.case_sk) AS m        
  ON vc.case_sk = m.case_sk  AND        
  do.demands_date = m.max_demands_date 

その理由は(A INNER JOIN B)、Aの行をBの行に一致させることができる場合にのみ、レコードを保持するためです。要求がない場合、派生テーブル(サブクエリ)は、に対してNULLを返しますがmax_demands_date、これは。と一致しませんdo.demands_date = m.max_demands_date。これにより、caseレコードが削除されます。

于 2012-12-14T19:17:54.400 に答える