0

これはばかげた質問のように聞こえるかもしれません - これが以前に回答されていたら (ほぼ確実に) 申し訳ありませんが、検索で回答を見つけることができませんでした。

特定の日のトランザクション、前月のトランザクション、前の 6 か月のトランザクション、その後のトランザクションなど、さまざまな列のさまざまな方法でテーブルの値をサブクエリとして集計するクエリがあります。メイン テーブルを tx としてエイリアスし、次にサブクエリ エイリアスを tx1 としてエイリアスしました

SELECT 
    tr.transaction_value
    ,ISNULL(
         (SELECT SUM(tr1.transaction_value) FROM [MyDB].[dbo].[Transactions] tr1
         WHERE tr1.Client_Ref = tr.Client_Ref),0) AND tr1.Transaction_Date > tr.Transaction_Date 
     ),0) as 'Future_Transactions'
    ,ISNULL(
         (SELECT SUM(tr1.transaction_value) FROM [MyDB].[dbo].[Transactions] tr1
         WHERE tr1.Client_Ref = tr.Client_Ref),0) AND tr1.Transaction_Date < tr.Transaction_Date 
     ),0) as 'Prior_Transactions'
FROM [MyDB].[dbo].[Transactions] tr 

サブクエリを含む7つの列があり、サブクエリでテーブルを7回定義している場合、再作成するのではなく、メインテーブルクエリでINNER JOINとしてtx1を作成することが可能であり、より良い(より効率的で読みやすい)かどうかを知りたい各サブクエリでそれを使用します。そうであれば、WHERE 句をどのようにコーディングしますか? ありがとう:o)

4

1 に答える 1

0

これは同等であり、パフォーマンスが向上するはずです。

SELECT 
    tr.transaction_value
    ,SUM(tr1.transaction_value) as 'Future_Transactions'
    ,SUM(tr2.transaction_value) as 'Prior_Transactions'
FROM [MyDB].[dbo].[Transactions] tr
LEFT JOIN [MyDB].[dbo].[Transactions] tr1 ON tr1.Client_Ref = tr.Client_Ref AND tr1.Transaction_Date > tr.Transaction_Date 
LEFT JOIN [MyDB].[dbo].[Transactions] tr2 ON tr2.Client_Ref = tr.Client_Ref AND tr2.Transaction_Date < tr.Transaction_Date 
group by tr.transaction_value
于 2016-10-28T13:46:42.267 に答える