繁体   English   中英

来自不同表的总和 Sql server

[英]Sum from the different tables Sql server

我有几个表存储数量,我想分组并获得总和 - 多个表的原因是 nhibernate 判别器。 我正在使用 Union all 并且工作正常,但查询非常大。

我正在使用以下查询

     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;

是否有任何优雅的方式在单独的列中显示金额? 如果它是同一个表并且想要逐行显示,我可以使用分区。

试试这些查询,它很容易理解,而且可能比你的更快。

我假设这些值在您看来是独一无二的

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 

如果没有表结构和样本数据,那是我能做的最好的帮助你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM