【问题标题】:SQL SUM Down Rows and Sum of Sum Across ColumnsSQL SUM 向下行和跨列总和
【发布时间】:2014-08-07 16:07:13
【问题描述】:

我正在尝试在 SQL Server 2008 中创建一个查询...用一些表格示例更好地解释:


FinPeriodNr   BalJan   BalFeb   BalMar   BalApr

   1           100      100      200      400
   2           200      300      100      200

**

问题

**

我希望能够先汇总列,使其看起来像这样:

FinPeriodNr   BalJan   BalFeb   BalMar   BalApr

Sum of rows    300      400      300      600

然后能够将各列相加得出总余额,如下所示:

FinPeriodNr   TotalSumofBal

                  1600     

是否有可能在一个查询下在 SQL 中汇总所有这些内容,如果可以,我需要使用什么?交叉表?

到目前为止,我的代码只能让我进入第二张桌子

SELECT     dbo.Company.CompanyID, dbo.Company.CompanyName,     SUM(dbo.SalesSummaryLedgerCOGBP.BalJan) AS SumBalJan, 
                  SUM(dbo.SalesSummaryLedgerCOGBP.BalFeb) AS SumBalFeb,     SUM(dbo.SalesSummaryLedgerCOGBP.BalMar) AS SumBalMar, 
                  SUM(dbo.SalesSummaryLedgerCOGBP.BalApr) AS SumBalApr, SUM(dbo.SalesSummaryLedgerCOGBP.BalMay) AS SumBalMay, 
                  SUM(dbo.SalesSummaryLedgerCOGBP.BalJun) AS SumBalJun, SUM(dbo.SalesSummaryLedgerCOGBP.BalJul) AS SumBalJul, 
                  SUM(dbo.SalesSummaryLedgerCOGBP.BalAug) AS SumBalAug, SUM(dbo.SalesSummaryLedgerCOGBP.BalSep) AS SumBalSep, 
                  SUM(dbo.SalesSummaryLedgerCOGBP.BalOct) AS SumBalOct, SUM(dbo.SalesSummaryLedgerCOGBP.BalNov) AS SumBalNov, 
                  SUM(dbo.SalesSummaryLedgerCOGBP.BalDec) AS SumBalDec

FROM         dbo.FinancialPeriodCOGBP INNER JOIN
                  dbo.SalesSummaryLedgerCOGBP ON dbo.FinancialPeriodCOGBP.FinPeriodNr = dbo.SalesSummaryLedgerCOGBP.FinPeriodNr INNER JOIN
                  dbo.Company ON dbo.SalesSummaryLedgerCOGBP.CompanyID = dbo.Company.CompanyID

GROUP BY dbo.Company.CompanyName, dbo.Company.CompanyID, dbo.Company.Customer, dbo.FinancialPeriodCOGBP.FinStatusOpen

HAVING      (dbo.Company.Customer = 1) AND (dbo.FinancialPeriodCOGBP.FinStatusOpen = 1)

请告诉我是否有解决方案,因为我已经尝试了很多但无济于事。

【问题讨论】:

  • 我没有仔细阅读你的问题,但我想你可能想使用名为ROLLUPCUBE的函数 - 我不知道这些分析函数是否在你的sql版本中方言
  • + 总结单个列。例如:SUM(dbo.SalesSummaryLedgerCOGBP.BalJan) + SUM(dbo.SalesSummaryLedgerCOGBP.BalFeb)+...+SUM(dbo.SalesSummaryLedgerCOGBP.BalDec) 。您可能还想考虑使用表别名。

标签: sql sql-server sql-server-2008 sum crosstab


【解决方案1】:
select 
sum(FinPeriodNr) as  FinPeriodNr 
, sum(BalJan) + sum(BalFeb) + sum(BalMar) + sum(BalApr) as TotalSumofBal
FROM
Tble

【讨论】:

    【解决方案2】:

    我会建议两件事,WITH ROLLUP 和使用表别名。该列没有汇总年份的快捷方式,但行汇总的快捷方式是 GROUP BY 子句中的 WITH ROLLUP。此外,根据您发布的查询,您没有选择或按 HAVING 子句中的两列排序,因此我将它们从 GROUP BY 中删除并将它们放在 WHERE 子句中。这就是我想出的。

    SELECT
        Company.CompanyID, Company.CompanyName,
        SUM(SaleSL.BalJan) AS SumBalJan,    SUM(SaleSL.BalFeb) AS SumBalFeb,
        SUM(SaleSL.BalMar) AS SumBalMar,    SUM(SaleSL.BalApr) AS SumBalApr,
        SUM(SaleSL.BalMay) AS SumBalMay,    SUM(SaleSL.BalJun) AS SumBalJun,
        SUM(SaleSL.BalJul) AS SumBalJul,    SUM(SaleSL.BalAug) AS SumBalAug,
        SUM(SaleSL.BalSep) AS SumBalSep,    SUM(SaleSL.BalOct) AS SumBalOct,
        SUM(SaleSL.BalNov) AS SumBalNov,    SUM(SaleSL.BalDec) AS SumBalDec,
        SUM(
            SaleSL.BalJan + SaleSL.BalFeb + SaleSL.BalMar + SaleSL.BalApr
            SaleSL.BalMay + SaleSL.BalJun + SaleSL.BalJul + SaleSL.BalAug
            SaleSL.BalSep + SaleSL.BalOct + SaleSL.BalNov + SaleSL.BalDec
        ) AS SumBalTotal
    FROM
        dbo.FinancialPeriodCOGBP FP
            INNER JOIN dbo.SalesSummaryLedgerCOGBP SaleSL ON FP.FinPeriodNr = SaleSL.FinPeriodNr
            INNER JOIN dbo.Company ON SaleSL.CompanyID = Company.CompanyID
    WHERE (Company.Customer = 1) AND (FP.FinStatusOpen = 1)
    GROUP BY Company.CompanyName, Company.CompanyID WITH ROLLUP
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多