sql - 如何填补 Access 表中的每日日期空白?
问题描述
我有一个名为 Test
三列的表:Account, Date, and Amount
. 日期如下所示:
Account Date Amount
1 25/01/2013 5000
1 20/01/2013 3000
2 25/01/2016 4000
2 20/01/2016 1000
基本上,金额只有在发生变化时才会记录下来。例如,对于Account 1
,Amount
从 20/01/2013 到 24/01/2013 是 3000,然后它变为 5000,因此,我们有记录。
我想完成每个记录从第一条记录到最后一条记录的天数account
例如,对于Account 1
,我想要从 20/01/2013 到 24/01/2013 的所有天数Date
和 3000天数Amount
我知道这是一个棘手的问题,非常感谢您的帮助。非常感谢 !!
解决方案
你只需要找到第一个和最后一个日期。反正:
首先,找到最小和最大日期:
SELECT
Account,
Min(tblProvider.[Entry Date]) AS FirstDate,
Max(tblProvider.[Entry Date]) AS LastDate
FROM
Test
GROUP BY
Account;
将此保存为qDateMinMax。
然后创建因子查询:
SELECT DISTINCT
[Thousands]+[Hundreds]+[Tens]+[Ones] AS Factor,
1000*Abs([Mille].[id] Mod 10) AS Thousands,
100*Abs([Centa].[id] Mod 10) AS Hundreds,
10*Abs([Deca].[id] Mod 10) AS Tens,
Abs([Uno].[id] Mod 10) AS Ones
FROM
MSysObjects AS Uno,
MSysObjects AS Deca,
MSysObjects AS Centa,
MSysObjects AS Mille;
将此另存为qdxFactor。
现在,组装这些:
SELECT
qDateMinMax.Account,
qDateMinMax.FirstDate,
qDateMinMax.LastDate,
DateAdd("d",[Factor],[FirstDate]) AS OtherDate,
(Select Last(Amount)
From Test
Where Test.Account = qDateMinMax.Account
And Test.[Entry Date] = qDateMinMax.LastDate) As LastAmount
FROM
qDateMinMax,
qdxFactor
WHERE
DateAdd("d",[Factor],[FirstDate]) <= [LastDate]
ORDER BY
qDateMinMax.Account,
DateAdd("d",[Factor],[FirstDate]);
对于中位数:
SELECT
qDateMinMax.Account,
qDateMinMax.FirstDate,
qDateMinMax.LastDate,
DateAdd("d",[Factor],[FirstDate]) AS OtherDate,
(Select (Min(Amount) + Max(Amount)) / 2
From Test
Where Test.Client = qDateMinMax.Account
And Test.[Entry Date] Between qDateMinMax.FirstDate And qDateMinMax.LastDate) AS MedAmount
FROM
qDateMinMax,
qdxFactor
WHERE
DateAdd("d",[Factor],[FirstDate]) <= [LastDate]
ORDER BY
qDateMinMax.Account,
DateAdd("d",[Factor],[FirstDate]);
按年月分组:
SELECT DISTINCT
qDateMinMax.Account,
Format([FirstDate],"yyyymm") AS FirstYM,
Format([LastDate],"yyyymm") AS LastYM,
Format(DateAdd("d",[Factor],[FirstDate]),"yyyymm") AS YM,
(Select (Min(Amount) + Max(Amount)) / 2
From Test
Where Test.Client = qDateMinMax.Account
And Test.[Entry Date] Between qDateMinMax.FirstDate And qDateMinMax.LastDate) AS MedAmount
FROM
qDateMinMax,
qdxFactor
WHERE
DateAdd("d",[Factor],[FirstDate]) <= [LastDate];
要包括最后一个金额:
SELECT DISTINCT
qDateMinMax.Account,
Format([FirstDate],"yyyymm") AS FirstYM,
Format([LastDate],"yyyymm") AS LastYM,
Format(DateAdd("d",[Factor],[FirstDate]),"yyyymm") AS YM,
(Select (Min(Amount) + Max(Amount)) / 2
From Test
Where Test.Client = qDateMinMax.Account
And Test.[Entry Date] Between qDateMinMax.FirstDate And qDateMinMax.LastDate) AS MedAmount,
(Select Amount
From Test
Where Test.Client = qDateMinMax.Account
And Test.[Entry Date] =LastDate) AS LastAmount
FROM
qDateMinMax,
qdxFactor
WHERE
DateAdd("d",[Factor],[FirstDate] <= [LastDate];
推荐阅读
- java - 我正在阅读“Java 编程和数据结构简介”一书,在解释类抽象和封装的章节中,它说:
- node.js - 如何在 Mongoose 中正确格式化 API 响应?
- javascript - 做一些freecodecamp问题,我遇到了一个指导对象值的小问题
- graphql - 阿波罗,Next.js,Strapi,GraphQL 错误'
. ' 在方案或关系中找不到 - javascript - Javascript从电报中保存用户名
- javascript - 在angularJs的自定义指令中观察错误抛出错误
- vue.js - Safari 上未显示 Vuetify mdi 图标
- javascript - 如何在反应中将道具传递给多级组件?
- javascript - 脚本未从外部文件加载 css 属性
- postgresql - PostgreSQL Group By 查询结果不显示组值,只显示列名