2017-09-25 4 views
-1

私は金額を格納するテーブルのカップルを持っていて、私はグループ化して合計を得ます - mutipleテーブルの理由はnhibernate descriminatorsです。 私はUnion allを使用していますが、クエリは非常に大きいです。私は、クエリ、次の異なるテーブルからの合計SQLサーバー

を使用しています

 SELECT CustomerAccountNumber, 
     vc.CustomerName, 
     SUM(PermAmount) AS PermAmount, 
     SUM(FreetextAmount) AS FreetextAmount, 
     (SUM(PermAmount) + SUM(FreetextAmount)) AS TotalAmountByCustomer 
FROM 
(
    SELECT pp.CustomerAccountNumber, 
      pl.Amount AS PermAmount, 
      0 AS FreetextAmount 
    FROM dbo.PermanentPlacementTransactionLine pl 
     INNER JOIN dbo.TransactionLine tl ON pl.TransactionLineId = tl.Id 
     INNER JOIN dbo.PermanentPlacement pp ON pl.PermanentPlacementId = pp.Id 
    WHERE tl.CurrentStatus = 1 
    GROUP BY pp.CustomerAccountNumber, 
      pl.Amount, 
      tl.Id 
    UNION ALL 
    SELECT ft.CustomerAccountNumber, 
      0 AS PermAmount, 
      ft.Amount AS FreetextAmount 
    FROM dbo.FreeTextTransactionLine fttl 
     INNER JOIN dbo.TransactionLine tl ON fttl.TransactionLineId = tl.Id 
     INNER JOIN dbo.[FreeText] ft ON fttl.FreeTextId = ft.Id 
    WHERE tl.CurrentStatus = 1 
    GROUP BY ft.CustomerAccountNumber, 
      ft.Amount, 
      tl.Id 
) WIPSummary 
INNER JOIN dbo.vw_Customer vc ON WIPSummary.CustomerAccountNumber = vc.CustomerAccount 
GROUP BY CustomerAccountNumber, 
     vc.CustomerName; 

別々の列に金額を表示する任意のエレガントな方法はありますか? パーティションテーブルが同じテーブルで、行単位で表示したい場合は、partition byを使用できます。

+0

このクエリと目的の出力の小さなサンプル出力を表示できますか?これをCTEで最初にラップすると、おそらくパーティションを使うことができます。 – Simon

答えて

1

これらのクエリを試してみてください。わかりやすく、おそらくあなたより速いでしょう。

は、私は、テーブルの構造やサンプルデータは、それは私はあなたを助けるためにできる最善でない場合の値は、あなたのビュー

WITH cte_a 
    AS (SELECT pp.customeraccountnumber 
       ,Sum(pl.amount) AS PermAmount 
       ,0    AS FreetextAmount 
     FROM dbo.permanentplacementtransactionline pl 
       INNER JOIN dbo.transactionline tl 
         ON pl.transactionlineid = tl.id 
       INNER JOIN dbo.permanentplacement pp 
         ON pl.permanentplacementid = pp.id 
     WHERE tl.currentstatus = 1 
     GROUP BY pp.customeraccountnumber), 
    cte_b 
    AS (SELECT ft.customeraccountnumber 
       ,0    AS PermAmount 
       ,Sum(ft.amount) AS FreetextAmount 
     FROM dbo.freetexttransactionline fttl 
       INNER JOIN dbo.transactionline tl 
         ON fttl.transactionlineid = tl.id 
       INNER JOIN dbo.[freetext] ft 
         ON fttl.freetextid = ft.id 
     WHERE tl.currentstatus = 1 
     GROUP BY ft.customeraccountnumber) 
SELECT vc.customeraccountnumber 
     ,vc.customername 
     ,Isnull(A.permamount, 0)  AS PermAmount 
     ,Isnull(B.freetextamount, 0) AS FreetextAmount 
     ,Isnull(A.permamount, 0) 
     + Isnull(B.freetextamount, 0) AS TotalAmountByCustomer 
FROM dbo.vw_customer vc 
     LEFT JOIN cte_a a 
       ON vc.customeraccount = A.customeraccountnumber 
     LEFT JOIN cte_b b 
       ON vc.customeraccount = A.customeraccountnumber 

で一意であることを前提としています。

関連する問題