Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算SQL SERVER中两个日期之间的总和_Sql_Sql Server - Fatal编程技术网

计算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. . . 然后您需要动态
    枢轴