SQL Server запрос между датами и статусом - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть таблица продуктов, которая выглядит так

ProductId Cost
1     200       
2     800       
3     630       

и у меня есть статус продукта, который выглядит так:

StatusId ProductId StatusDate ProductStatus
1           ,1      ,1-1-17       ,1
2           ,1      ,2-12-17      ,2
3           ,2      ,21-5-17       ,1
4           ,3      ,11-5-18       ,1
5           ,2      ,18-5-18       ,2
6           ,2      ,10-8-18       ,1

Мне нужен запрос, который SUM каждый месяц (1-е число в месяце), чтобы «ProductStats» равнялся 1 стоимости продукта, поэтому запрос должен выглядеть примерно так:

Year Month Costs
2017   1    200
2017   2    200
2017   3    200
2017   4    200
2017   5    200
2017   6    1000
2017   7    1000
2017   8    1000
2017   9    1000
2017   10   1000
2017   11   1000
2017   12    1000
2018   1     800

Ответы [ 3 ]

0 голосов
/ 05 апреля 2019

Предполагая, что комментарий Саймона верен, вы можете попробовать что-то вроде этого:

SELECT DATEPART(year, StatusDate) As 'Year', DATEPART(month, StatusDate) AS 'Month', SUM(Cost) As 'Cost' FROM
Products p
INNER JOIN
StatusProducts sp
ON
p.ProductId = sp.ProductId
WHERE 
sp.ProductStatus = 1
GROUP BY
DATEPART(year, StatusDate), DATEPART(month, StatusDate)
0 голосов
/ 05 апреля 2019

Вам нужно использовать функцию управления окнами, чтобы получить промежуточную сумму

DECLARE  @Years TABLE ([year] int)
DECLARE @months TABLE([month] INT)

INSERT INTo @years([year])
VALUES(2017),(2018)

INSERT INTo @months([month])
VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)


select Y.YEAR,M.MONTH,ISNULL(SUM(Costs) OVER(Partition By Y.Year ORDER BY Y.YEAR,M.MONTH),0) Costs from @years Y
CROSS JOIN @months M
LEFT JOIN (
select YEAR(STatusDate) Year,MONTH(StatusDate) Month,SUM(Cost) Costs from products P
JOIN StatsProduct PS ON P.id= PS.productID
GROUP BY YEAR(STatusDate) ,MONTH(StatusDate)) ProdStats
ON ProdStats.Year=Y.Year and ProdStats.Month=M.Month
0 голосов
/ 05 апреля 2019

Вы хотите объединить обе таблицы и сделать групповое, что-то вроде этого.Дополнительной проблемой могут быть ваши типы данных столбцов даты.(VARCHAR?).Тогда все может стать немного уродливым.

SELECT '20' + RIGHT (StatusDate, 2) AS YEAR,
        CASE WHEN LEFT (RIGHT ('StatusDate', 5), 1) = '-' THEN RIGHT (LEFT (RIGHT ('StatusDate', 5), 2), 1)
        ELSE LEFT (RIGHT ('StatusDate', 5), 2) END AS MNTH,
        SUM (Cost) AS TotalCosts
FROM TableA AS A
INNER JOIN TableB AS B ON B.ProductId = A.ProductId 
GROUP BY '20' + RIGHT (StatusDate, 2),
CASE WHEN LEFT (RIGHT ('StatusDate', 5), 1) = '-' THEN RIGHT (LEFT (RIGHT ('StatusDate', 5), 2), 1)
     ELSE LEFT (RIGHT ('StatusDate', 5), 2) 

Лучшим вариантом будет изменить ваши типы данных.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...