表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上。这需要时间。
每个月的列将包含该特定供应商针对该特定月份的金额总和。对此有任何帮助表示赞赏。
答案 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);
要为每月创建列,您可以使用pivot
或select 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;
我使用 {{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 可能会有所帮助。