2016-04-26 5 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 

Результат между датами фильтра пользователем и дата должны по:

между 01/03/2016 и 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 должен работать лучше, хотя.

Смежные вопросы