我有一个看起来像这样的表:
+--------+---------------------+-------+--------+-----------+
| PartNo | Date | Inv | Retail | Wholesale |
+--------+---------------------+-------+--------+-----------+
| 1 | 2018-05-12 00:00:00 | 15 | $100 | $90 |
| 2 | 2018-05-12 00:00:00 | 20 | $200 | $150 |
| 3 | 2018-05-12 00:00:00 | 25 | $300 | $200 |
| 1 | 2018-05-13 00:00:00 | 10 | $95 | $90 |
| 2 | 2018-05-14 00:00:00 | 15 | $200 | $150 |
| 3 | 2018-05-14 00:00:00 | 20 | $300 | $200 |
+--------+---------------------+-------+--------+-----------+
我想用Mysql查询看起来像这样:
+--------+------+--------+
| PartNo | Sold | Profit |
+--------+------+--------+
| 1 | 5 | $25 |
| 2 | 5 | $250 |
| 3 | 5 | $500 |
+--------+------+--------+
我需要在计算日期范围内总计和利润之间的差异时按PartNo进行分组。
单位利润必须通过在日期范围的最后一天(或记录)中减去零售批发来计算。
我觉得这应该很容易但是日期范围内的差异令我感到困惑,并且在日期范围内处理完全没有在日期范围输入上开始或结束的记录正在失去我。
任何帮助都会受到超级赞赏。
谢谢。
答案 0 :(得分:2)
您可以在期间的开始和结束时查看情况如果未找到任何开始情况,则假设没有库存。如果没有找到最终情况,则意味着在此期间没有销售。
例如,从android {
compileSdkVersion 'android-P'
defaultConfig {
targetSdkVersion 'P'
}
...
}
开始到2018-05-13
结束的时间段:
2018-05-14
答案 1 :(得分:2)
SetObjectField
使用窗口功能,首先添加一个新列以跟踪每个partno的最大日期。因此, FROM 中的内部查询将生成这样的行,并将一列添加到原始数据集中,
SELECT c.partno as partno,MAX(c.inv)-MIN(c.inv) as sold,SUM(CASE WHEN c.date = c.last_date THEN profit else 0 END)*(MAX(c.inv)-MIN(c.inv)) as profit
FROM (SELECT partno,date,inv,retail-wholesale as profit,MAX(date) OVER (partition by partno) AS last_date FROM test1)c
GROUP BY c.partno
ORDER BY c.partno;
突出显示的字段是添加到数据集的字段,该字段是该部件号的日期范围中的最后一个日期!
现在从这个结果中,我们可以通过检查日期列等于我们追加的新列的行来获取利润,这实际上是通过从零售中减去批发并乘以项来计算最后日期的利润出售。
PS:售出物品的逻辑是按部分分组并从MAX(Inv)中减去MIN(Inv)