2017-11-19 8 views
0

私はQuickBooksにアップロードされるレポートを作成しています。私は、それぞれ1つの計算の変更のために、すべての7つのクエリを結合する必要があります。以下は、最初の2つのクエリの例です:繰り返しユニオンを最適化するすべてのSSMSクエリ

SELECT 
    Clients.Id 
    ,@CNumber as 'Check Number' 
    ,@TDate as 'Transac Date' 
    ,CONCAT(@Memo, 'Debt') as 'Memo' 
    ,Compensation.Payment as 'Amount' 

FROM Compensation 

    JOIN Clients on Id = Compensation.ClientId 

UNION ALL 

SELECT 
    Clients.Id 
    ,@CNumber as 'Check Number' 
    ,@TDate as 'Transac Date' 
    ,CONCAT(@Memo, 'Insurance') as 'Memo' 
    ,InsuranceInvoices.WeeklyAmount 

FROM InsuranceInvoices 

は、一つ一つの労働組合のためにClients.Id、@CNumber、@TDate、CONCAT(@Memo、変数)を繰り返す必要を排除する方法はあります?「メモ」としてCONCAT(@MEMO、変数)については

、私はおそらく(それも可能かどうかわからない)の配列を作成し、すべての連合の各新しい反復に挿入することができます。

私は、「Amount」のそれぞれの新しい計算で、最初の4列を反復するループを作成する方法がわかりません。

これは、最適化/コードの可読性のためだけです。しかし、それは155行で、次回同じようなことをやろうとすれば、違うやり方でやり直すことができるのだろうかと思う。

これまでに調査した内容:次のスタックオーバーフローlinkは多少似ていますが、異なる 'FROM'テーブルを使用していません。データは単一の表から得られます。私のデータは4つのテーブルから来ています。同じテーブルの2つのクエリのサンプルの下:

SELECT 
     Clients.Id 
     ,@CNumber as 'Check Number' 
     ,@TDate as 'Transac Date' 
     ,CONCAT(@Memo, 'Debt') as 'Memo' 
     ,Compensation.PaybackAmount as 'Amount' 

    FROM Compensation 

     JOIN Clients on Id = Compensation.ClientId 

    WHERE 
     Compensation.Week = @TrailingWeekEnd 

UNION ALL 

    SELECT 
     Clients.Id 
     ,@CNumber as 'Check Number' 
     ,@TDate as 'Transac Date' 
     ,CONCAT(@Memo, 'Vehicle') as 'Memo' 
     ,Compensation.VDAccumulation as 'Amount' 

    FROM ContractorSettlements 

     JOIN Clients on Id = Compensation.ClientId 

    WHERE 
     Compensation.Week = @TrailingWeekEnd 

これは悪い質問ですが、私の謝罪です。私の考えでは、これはループ内での作業を想像していますが、それを最適化する方法は正直に分かりません。私が提供できる情報が他にもある場合は、私に知らせてください。間違った構文のにもかかわらず

+1

役立ちます:' Compensation.PaymentからのID = Compensation.ClientId'にクライアントを登録しよう。あなたの質問にコードを修正してください。 –

+0

編集ありがとうございます。私は、投稿する前にクエリを修正しなければならなかった。 –

答えて

1

クエリで持っていますが、次の

説明

  1. クエリ
  2. することにより、データを差別テーブルから抽出するのに必要なデータのみを使用することができますDebtおよびVehicle
  3. のような各テーブルのタイプを追加します。結果を目的のパラメータと組み合わせます

クエリ

;with report as(
    select [Id] = ClientId, 
      [Amount] = PaybackAmount, 
      [Type] = 'Debt' 
    Compensation c 
    where c.Week = @TrailingWeekEnd 
    union all 
    select ClientId, 
      VDAccumulation, 
      'Vehicle' 
    from ContractorSettlements c 
    where c.Week = @TrailingWeekEnd 
) 
select Id, 
     [Check Number] = @CNumber, 
     [Transac Date] = @TDate, 
     [Memo] = Concat(@Memo,[Type]), 
     Amount 
from report 

希望これは、この `FROM`節は意味をなさないあなた

+0

ありがとうございました!エラーに関しては、投稿する前にクエリを修正する必要がありました。この方法で約50本程度の線が除去されました。 –

関連する問題