- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个非常棘手的问题,我现在正试图弄清楚它,
我有这个查询结果集
SELECT * FROM Orders
OrderID | OrderAmount | OrderDate | Expiry Date
1 $100 2008-01-01 2009-12-31
2 $200 2009-01-01 2010-12-31
3 $300 2010-01-01 2011-12-31
4 $3 2010-01-01 2010-06-31
5 $400 2007-01-01 2009-05-31
现在,我如何按 OrderDate - ExpiryDate daterange 每年分解每个订单
我希望在我的 RDLC 报告中得到类似这样的结果
ORDERS CONSUMED PER YEAR
OrderID | YEAR | Consumed Amount
1 2008 $50
1 2009 $50
2 2009 $100
2 2010 $100
3 2010 $150
3 2011 $150
4 2010 $3
5 2007 $160
5 2008 $160
5 2009 $80 <---- another tricky part
计算基于术语 eq。 (2 年 300 美元的期限意味着每年 150 美元)
我如何在 MS-SQL 查询中执行此操作?
** 我知道标题好像不对^^,我就是找不到合适的标题
已编辑:添加了更多样本和解释
最佳答案
如果这是 SQL Server 2005 或更高版本,您可以使用通用表表达式递归构建月份表,并使用它来计算每年消耗的订单量。
一些注意事项:
此解决方案假定时间段基于整月。方法是确定每月消耗的订单量,然后将其乘以一年中的月数。如果需要,您可以修改它以使用每天消耗的量。
在最后的 select
中,我将 money
转换为精度更高的 decimal
以尝试避免舍入问题。您可能需要对此进行调整以满足您的需要,但我不确定您是否能够完全避免舍入问题。
OrderID 5 的结果与您的示例结果不匹配。这是因为该示例在 2009 年有 5 个月,而不是 6 个月。
create table #Orders
(
OrderID int,
OrderAmount money,
OrderDate datetime,
ExpiryDate datetime
)
insert into #Orders values(1, 100, '2008-01-01', '2009-12-31'),
(2, 200, '2009-01-01', '2010-12-31'),
(3, 300, '2010-01-01', '2011-12-31'),
(4, 3, '2010-01-01', '2010-06-30'),
(5, 400, '2007-01-01', '2009-05-31')
;with cte_months
as
(
select OrderID, OrderDate, year(OrderDate) OrderYear
from #Orders
union all
select m.OrderID, dateadd(month, 1, m.OrderDate), year(dateadd(month, 1, m.OrderDate))
from cte_months m
inner join #Orders o on m.OrderID = o.OrderID
where dateadd(month, 1, m.OrderDate) <= o.ExpiryDate
)
select m.OrderId, m.OrderYear, cast(sum(o.MonthlyAmount) as money) as ConsumedAmount
from
(
select OrderID, cast(OrderAmount as decimal(12,6)) / (datediff(month, orderdate, ExpiryDate) + 1) as MonthlyAmount
from #Orders
) o inner join cte_months m on o.OrderID = m.OrderID
group by m.OrderID, m.OrderYear
drop table #Orders
结果:
OrderId OrderYear ConsumedAmount
----------- ----------- ---------------------
1 2008 50.00
1 2009 50.00
2 2009 100.00
2 2010 100.00
3 2010 150.00
3 2011 150.00
4 2010 3.00
5 2007 165.5172
5 2008 165.5172
5 2009 68.9655
关于SQL:按年份切片 DateRange 数据(棘手),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7761881/
我需要更改 DATERANGE 列的范围。默认值为 bounds='[)'。 这是我当前的专栏: from sqlalchemy.dialects.postgresql import DATERANG
我从客户端发送文档查询,其中currentDate在附加到所有文档的两个值之间。该文档具有expireDate和availableDate。 如何制定此查询?推测我想出了以下方法,但不起作用: {
以this为例,我想到了以下查询。我没有得到任何结果,但是如果我将“01/01/2017”替换为“null”,那么我会得到记录(全部来自2014年,因此我知道它应该返回数据)。谁能帮我吗? var
我有一个简单的表,它有一个带有日期类型的 user_birthday 字段(可以是空值) CREATE TABLE users ( user_id bigserial NOT NULL, us
我在调用数据库中的存储过程时遇到问题 这是我数据库中的存储过程 DELIMITER $$ USE `sample`$$ DROP PROCEDURE IF EXISTS `sp_ReturnAtten
我的一些域对象包含日期范围作为一对开始和结束日期属性: public class Period { public DateTime EffectiveDate { get; set; } pu
有没有办法在 Shiny 中破解或创建一个 dateRangeInput() 选择器,以便它仅选择月年(没有日期),或者自动选择所选月份的第一天,而不需要显示一天的选择?或者我应该创建另一个月日期选择
我看不出如何创建一个以 infinity 作为上限的日期范围。 Postgres 将两个输入都转换为独占上限: create table dt_overlap ( id serial prim
我有两个表,每个表都有相同的 ID,从第一次加入成员(member)开始。 一旦成员被批准,他/她也会因某些原因和条件而被拒绝。 查询结果需要按日期范围排序,然后根据所选 ID 的每个日期计算批准总数
我正在尝试将日期范围选择器添加到我的 html 文件中,但是当我单击输入框时无法显示它。它适用于日期选择器,但我希望它提供点击日期范围的功能。几天来我一直在努力解决这些问题,真的需要一些帮助。提取的代
我在 PostgreSQL(9.3) 中有一张表 daterange字段类型。 我可以像使用 JDBC 的字符串一样选择这个字段,但我不能将它插入到表中。 我尝试过的: PreparedStateme
我的报告页面的要求是:默认日期开始 = 每月 1 日(完成)默认日期结束 = 今天的日期(完成) 由于我们不希望应用程序因数据而崩溃,因此日期范围不应超过 30 天。我无法实现这一部分。没有最短日期,
我有一个非常棘手的问题,我现在正试图弄清楚它, 我有这个查询结果集 SELECT * FROM Orders OrderID | OrderAmount | OrderDate | E
我在 Python 和 Pandas 中工作,需要将一个日期范围划分为多个日期范围 - 并且需要这些范围的开始日期和结束日期 所以像这样: pd.date_range(start='20180301'
我有以下数据框: name from amount days A 7/31/18 200 1 B 7/31/18 300
有什么简单的方法可以将数据表切片为一个范围并对一个范围的计数求和吗? 假设我有以下数据表 Date Count 5/9/2016 5 5/10/2016 1 5/11/2016 2
我有以下类(class) public class DateRange { private DateTime startDate; private DateTime endDate;
我在 pg (postgresql) 中使用 "sequelize": "^2.0.0-rc3",此时我正在尝试使用日期范围进行原始查询,但 sequelize 不返回数据。 当我在 postgres
我有一个包含多年记录的数据框: WarName | StartDate | EndDate ----------------------------------------
查看 vue2-daterange-picker 示例在 https://innologica.github.io/vue2-daterange-picker/#usage 请问Clear按钮是如何实
我是一名优秀的程序员,十分优秀!