计算SQL SERVER中两个日期之间的总和
我有两张桌子 历法计算SQL SERVER中两个日期之间的总和,sql,sql-server,Sql,Sql Server,我有两张桌子 历法 FirstDate | LastDate ------------+----------- 2020-05-01 2020-05-03 2020-05-02 2020-05-04 剖析率 ID | Date | Rate | Product ---+------------+------+---------- 1 2020-05-01 100 Prod1 2 2020-05-02 200 Prod1
FirstDate | LastDate
------------+-----------
2020-05-01 2020-05-03
2020-05-02 2020-05-04
剖析率
ID | Date | Rate | Product
---+------------+------+----------
1 2020-05-01 100 Prod1
2 2020-05-02 200 Prod1
3 2020-05-03 300 Prod1
4 2020-05-04 400 Prod1
5 2020-05-01 150 Prod2
6 2020-05-02 250 Prod2
7 2020-05-03 350 Prod2
8 2020-05-04 450 Prod2
我想计算总数。像这样的
FirstDate | LastDate | Prod1 | Prod2
------------+-------------+--------+-------
2020-05-01 2020-05-03 600 750
2020-05-02 2020-05-04 900 1050
我所尝试的:
SELECT [Date], SUM([Rate])
FROM [ProfileRate]
WHERE [Date] BETWEEN '2020-05-01' AND '2020-05-04'
GROUP BY [Date]
请帮帮我。谢谢我认为这是一种加入和条件聚合:
SELECT c.FirstDate, c.LastDate,
SUM(CASE WHEN pr.prod = 'Prod1' THEN pr.Rate END) as prod1,
SUM(CASE WHEN pr.prod = 'Prod2' THEN pr.Rate END) as prod2
FROM Calender c LEFT JOIN
ProfileRate pr
ON pr.Date >= c.FirstDate AND pr.Date <= c.LastDate
GROUP BY c.FirstDate, c.LastDate;
选择c.FirstDate、c.LastDate、,
总和(当pr.prod='Prod1'然后pr.Rate END时的情况)为Prod1,
总和(pr.prod='Prod2'然后pr.Rate END时的情况)为Prod2
从日历c左连接
轮廓率
在pr.Date>=c.FirstDate和pr.Date上,我认为这是一个连接和条件聚合:
SELECT c.FirstDate, c.LastDate,
SUM(CASE WHEN pr.prod = 'Prod1' THEN pr.Rate END) as prod1,
SUM(CASE WHEN pr.prod = 'Prod2' THEN pr.Rate END) as prod2
FROM Calender c LEFT JOIN
ProfileRate pr
ON pr.Date >= c.FirstDate AND pr.Date <= c.LastDate
GROUP BY c.FirstDate, c.LastDate;
选择c.FirstDate、c.LastDate、,
总和(当pr.prod='Prod1'然后pr.Rate END时的情况)为Prod1,
总和(pr.prod='Prod2'然后pr.Rate END时的情况)为Prod2
从日历c左连接
轮廓率
在pr.Date>=c.FirstDate和pr.Date进行连接和条件聚合:
select c.fisrtdate, c.lastdate,
sum(case when pr.product = 'prod1' then rate else 0 end) as prod1,
sum(case when pr.product = 'prod2' then rate else 0 end) as prod2
from calendar c join
ProfileRate pr
on pr.date >= c.fisrtdate and pr.date <= c.lastdate
group by c.fisrtdate, c.lastdate;
选择c.fisrtdate、c.lastdate、,
总和(当pr.product='prod1'时,则为0结束)为prod1,
总和(当pr.product='prod2'时,则为0结束)为prod2
从日历c加入
轮廓率
在pr.date>=c.fisrtdate和pr.date进行连接和条件聚合:
select c.fisrtdate, c.lastdate,
sum(case when pr.product = 'prod1' then rate else 0 end) as prod1,
sum(case when pr.product = 'prod2' then rate else 0 end) as prod2
from calendar c join
ProfileRate pr
on pr.date >= c.fisrtdate and pr.date <= c.lastdate
group by c.fisrtdate, c.lastdate;
选择c.fisrtdate、c.lastdate、,
总和(当pr.product='prod1'时,则为0结束)为prod1,
总和(当pr.product='prod2'时,则为0结束)为prod2
从日历c加入
轮廓率
在pr.date>=c.fisrtdate和pr.date上,您必须执行几个步骤来解决问题:
将日历记录与配置文件相结合
确定哪些配置文件符合日历范围
每个配置文件和日期范围的总值
最后建立详细的日历信息
此查询符合条件
with DataForCalendar as
(
SELECT IdCalendar,FirstDate,LastDate,Id,DateRate,Rate,Product
FROM
Calendar CROSS JOIN ProfileRate
where DateRate between '2020-05-01' and '2020-05-05'
),
DetailForCalendar as
(
select IdCalendar,Rate,Product
from DataForCalendar
where DateRate between FirstDate and LastDate
),
TotalForCalendar as
(
select IdCalendar,Product,sum(Rate)As Total from DetailForCalendar
GROUP BY IdCalendar,Product
)
select Calendar.IdCalendar,Calendar.FirstDate,Calendar.LastDate,
TotalForCalendar.Product,TotalForCalendar.Total
from TotalForCalendar inner join
Calendar on TotalForCalendar.IdCalendar=Calendar.IdCalendar;
在本例中,还有一个产品和一个日历。您必须执行几个步骤来解决此问题:
将日历记录与配置文件相结合
确定哪些配置文件符合日历范围
每个配置文件和日期范围的总值
最后建立详细的日历信息
此查询符合条件
with DataForCalendar as
(
SELECT IdCalendar,FirstDate,LastDate,Id,DateRate,Rate,Product
FROM
Calendar CROSS JOIN ProfileRate
where DateRate between '2020-05-01' and '2020-05-05'
),
DetailForCalendar as
(
select IdCalendar,Rate,Product
from DataForCalendar
where DateRate between FirstDate and LastDate
),
TotalForCalendar as
(
select IdCalendar,Product,sum(Rate)As Total from DetailForCalendar
GROUP BY IdCalendar,Product
)
select Calendar.IdCalendar,Calendar.FirstDate,Calendar.LastDate,
TotalForCalendar.Product,TotalForCalendar.Total
from TotalForCalendar inner join
Calendar on TotalForCalendar.IdCalendar=Calendar.IdCalendar;
在本例中,还有一个产品和一个日历。您按[date]
分组,因此每个日期的值将得到一行。您按[date]
分组,因此每个日期的值将得到一行。谢谢您的回答。如果有N个产品会怎么样???那么每个产品都会有一个单独的SUM()
。谢谢你的回答。如果有N个产品会怎么样???那么每个产品都会有一个单独的SUM()
。谢谢你的回答。如果有N个产品呢???我不想hardcode@Aemash. . . 然后您需要动态pivot
。谢谢您的回答。如果有N个产品呢???我不想hardcode@Aemash. . . 然后您需要动态枢轴。