【发布时间】:2014-06-09 20:03:07
【问题描述】:
考虑下表。 Start_Date 是水果进入库存的时间,End_Date 是水果被处理掉的时间。请注意,这些日期范围可能会重叠。例如,从 2014-01-016 到 2014-02-01,库存中有 20 个苹果。
+------------------------------------------+
| [HISTORY_TABLE] |
+------------+------------+----------+-----+
| Start_Date | End_Date | Type | QTY |
+------------+------------+----------+-----+
| 2013-12-16 | 2014-02-01 | Apple | 12 |
| 2014-01-16 | 2014-06-01 | Apple | 8 |
| 2014-01-16 | 2014-04-11 | Banana | 5 |
| 2014-03-16 | 2014-04-16 | Banana | 7 |
| 2014-02-16 | 2014-03-01 | Orange | 24 |
| 2013-02-24 | 2014-05-01 | Orange | 2 |
+------------+------------+----------+-----+
我感兴趣的是每种水果的平均每月计数。对于 1 月份的苹果,每日累计苹果总数为:
((12 apples * 15 days) + (20 apples * 16 days) =
(180 apple days + 320 apple days) = 500 apple days
由于 1 月有 31 天,平均值为:
500 / 31 = 16.13
因此,1 月份的平均可用苹果数为 16.13。
可能存在具有相同日期、类型和数量的水果类型,但假设每个记录都是唯一的水果计数。我正在寻找的最终结果将如下所示(除了所有水果。)结果中的数字是准确的(至少我认为它们是......我手工计算的):
+-----------------------------------------+
| [RESULTS] |
+-------+------+------------+-----+-------+
| Month | Year | Fruit Type | QTY | Avg |
+-------+------+------------+-----+-------+
| 12 | 2013 | Apple | 192 | 6.19 |
| 01 | 2014 | Apple | 500 | 16.13 |
| 02 | 2014 | Apple | 236 | 8.43 |
| 03 | 2014 | Apple | 248 | 8.00 |
| 04 | 2014 | Apple | 240 | 8.00 |
| 05 | 2014 | Apple | 248 | 8.00 |
| 06 | 2014 | Apple | 8 | 0.27 |
+-------+------+------------+-----+-------+
一些设置初始数据的代码:
IF OBJECT_ID('tempdb..#LocalTempFruitTable', 'U') IS NOT NULL
DROP TABLE #LocalTempFruitTable
CREATE TABLE #LocalTempFruitTable(
Start_Date date,
End_Date date,
Type varchar(50),
QTY int)
INSERT INTO #LocalTempFruitTable (Start_Date,End_Date,Type,QTY) VALUES ('2013-12-16','2014-02-01','Apple','12')
INSERT INTO #LocalTempFruitTable (Start_Date,End_Date,Type,QTY) VALUES ('2014-01-16','2014-06-01','Apple','8')
INSERT INTO #LocalTempFruitTable (Start_Date,End_Date,Type,QTY) VALUES ('2014-01-16','2014-04-11','Banana','5')
INSERT INTO #LocalTempFruitTable (Start_Date,End_Date,Type,QTY) VALUES ('2014-03-16','2014-04-16','Banana','7')
INSERT INTO #LocalTempFruitTable (Start_Date,End_Date,Type,QTY) VALUES ('2014-02-16','2014-03-01','Orange','24')
INSERT INTO #LocalTempFruitTable (Start_Date,End_Date,Type,QTY) VALUES ('2013-02-24','2014-05-01','Orange','2')
SELECT * FROM #LocalTempFruitTable
【问题讨论】:
-
绝对不是“家庭作业”...我正在尝试构建的真实生活报告比这复杂得多。使用 CTE,我尝试从我正在查看的日期范围内的每一天的表格开始,然后将它与当天活动的每种“水果类型”的列表一起加入。我正在使用 DATEPART 将日期分解为月和年,并尝试按此分组。我得到了结果(我无法分享),但数字与应有的数字完全不符。
-
LEFT OUTER JOIN dch_results ON (dch_results.Start_Date = daySpan.Date OR dch_results.End_Date IS NULL))
-
什么知道...我回答了我自己的问题。
标签: sql-server date