2016-04-26 134 views
-1

我需要與他人之列由用戶和日期日期過濾器之間總計總SQL Server查詢

User  sales amount date 
-------------------------------------- 
danny car  10.000 25/02/2016 
danny moto  5.000 26/02/2016 
danny car  10.000 25/03/2016 
danny moto  5.000 26/03/2016 
danny moto  5.000 26/03/2016 
danny car  10.000 25/04/2016 
danny moto  5.000 26/04/2016 
danny car  10.000 25/05/2016 
danny moto  5.000 26/05/2016 

結果查詢應由:

之間2016年1月3日31/03/2016

User Total moto car  
------------------------------ 
danny 15.000 2  1  

我需要什麼查詢?

+6

向我們展示**您迄今的努力**第一!你有什麼嘗試?你卡在哪裏?我們會**幫助** - 但我們不會只爲您編寫整個代碼**! –

回答

1

嘗試Pivot

SELECT * FROM 
(
    SELECT User,sales,amount,datename(month, date) 
    FROM YoyrTable 
)A 
PIVOT 
(
    SUM(amount) 
    FOR sales in ([car],[moto]) 
)B 
1

另一種方法:

;WITH cte AS (
SELECT * 
FROM (VALUES 
('danny', 'car', 10.000, '2016-02-15'), 
('danny', 'moto', 5.000, '2016-02-26'), 
('danny', 'car', 10.000, '2016-03-25'), 
('danny', 'moto', 5.000, '2016-03-26'), 
('danny', 'moto', 5.000, '2016-03-26'), 
('danny', 'car', 10.000, '2016-04-25'), 
('danny', 'moto', 5.000, '2016-04-26'), 
('danny', 'car', 10.000, '2016-05-25'), 
('danny', 'moto', 5.000, '2016-05-26') 
) as t([User], sales, amount, [date]) 
) 

SELECT [user], 
     SUM(amount) as Total, 
     SUM(CASE WHEN sales = 'moto' THEN 1 ELSE 0 END) as moto, 
     SUM(CASE WHEN sales = 'car' THEN 1 ELSE 0 END) as car, 
     DATENAME(Month,[date]) as [date] 
FROM cte 
GROUP BY [user], DATENAME(Month,[date]),DATEPART(Month,[date]), DATEPART(Year,[date]) 
ORDER BY DATEPART(Month,[date]), DATEPART(Year,[date]) 

輸出:

user Total moto car date 
danny 15.000 1  1 February 
danny 20.000 2  1 March 
danny 15.000 1  1 April 
danny 15.000 1  1 May 

在查詢中把你的表名而不是cte

1

你的實際PIVOT應該像..

SELECT [User], 
     Total, 
     [moto], 
     [car], 
     [date] 
FROM 
(
    SELECT [User], 
      sales, 
      DATENAME(MONTH,date) [date], 
      SUM(amount) OVER (PARTITION BY [User], DATENAME(MONTH,date)) [Total] 
    FROM cte 
) T 
PIVOT 
(
    COUNT(sales) 
    FOR sales IN ([car], [moto]) 
) p 

通過@ gofr1答案應該,雖然有更好的表現。