如何按月按功能查找组中的总和?

时间:2014-05-01 06:14:04

标签: sql sql-server

TRANSACTIONTABLE中有三列:VendorID, TransacDate, Amount。我需要的输出是按供应商包含总和(金额)组的数据,但应按月分配。输出应该是这样的:列将是..

 VendorID, JAN'14, FEB'14, Mar'14 and so on....

我尝试了以下内容:SELECT VENDORID, SUM(AMOUNT) from TRANSACTIONTABLE where TRANSACDATE BETWEEN '2014-01-01' and '2014-01-31' ....然后再次为feb,mar等等。然后我将结果复制到每次执行vlookup的excel上。这需要时间。

每个月的列将包含该特定供应商针对该特定月份的金额总和。对此有任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

首先创建一个表

Create Table Transactions (VendorID INT, TransactDate Date, Amount money);

然后添加一些样本数据

INSERT INTO  Transactions (VendorID, TransactDate, Amount) VALUES           
   (1 ,  '2014/01/01', 1.00)
  ,(1 ,  '2014/01/10', 10.00)
  ,(1 ,  '2014/01/20', 100.00)
  ,(1 ,   '2014/02/01', 2.00)
  ,(1 ,  '2014/02/10', 20.00)
  ,(1 ,  '2014/02/20', 200.00)
  ,(2 ,   '2014/02/01', 2.00)
  ,(2 ,  '2014/02/10', 20.00)
  ,(2 ,  '2014/02/20', 200.00)
  ,(2 ,   '2014/03/01', 3.00)
  ,(2 ,  '2014/03/10', 30.00)
  ,(2 ,  '2014/03/20', 300.00);

由于已经对group by month and year提出了答案,因此这部分很容易:

Select VendorID, Year(TransactDate) as Year
     , Month(TransactDate) as Month
     , Sum(Amount) as SumAmount 
FROM Transactions
Group By VendorID 
  , Year(TransactDate)
  , Month(TransactDate); 

要为每月创建列,您可以使用pivotselect case。您可以read up on pivot in this article answer on dba.stackexchange - a stackoverflow sister site sqlfiddle to create a demo。我把它装到你的数据中:

SELECT * 
FROM ( Select VendorID, Year(TransactDate) as Year 
         , Month(TransactDate) as Month
         , Sum(Amount) as SumAmount 
    FROM Transactions
    Group By VendorID
          , Year(TransactDate)
          , Month(TransactDate)) as Src
PIVOT (
  Sum(SumAmount)
  FOR Month IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
) AS MPivot; 

完全正常工作的演示<​​/ h2>

我使用 {{3}} ,请考虑捐赠给他们。

答案 1 :(得分:0)

如果要按行生成结果,请尝试使用以下脚本。

SELECT VENDORID, DATENAME(MM,GETDATE())+''''+RIGHT(CAST(DATEPART(YY,GETDATE()) AS VARCHAR),2) AS [Month],SUM(AMOUNT) AS [Sum] 
 FROM TRANSACTIONTABLE
 GROUP BY VENDORID,DATENAME(MM,GETDATE())+''''+RIGHT(CAST(DATEPART(YY,GETDATE()) AS VARCHAR),2)

您可以通过稍微努力来安排结果列,例如使用一些循环。但是如果你希望你的查询应该返回结果列,那么sql server中的 PIVOT 可能会有所帮助。