如何修改SQL查询以识别两时间戳间预期销售额变动的营销活动
如何修改SQL语句以识别销售规划中变动的营销活动
表结构与测试数据
首先,我们的测试表结构和数据如下:
CREATE TABLE Sales_Planning ( Time_Stamp DATE, Campaign VARCHAR(255), Expected_Sales VARCHAR(255) ); INSERT INTO Sales_Planning (Time_Stamp, Campaign, Expected_Sales) VALUES ("2019-11-04", "Campaign01", "300"), ("2019-11-04", "Campaign02", "300"), ("2019-11-04", "Campaign03", "300"), ("2019-11-04", "Campaign04", "300"), ("2019-11-05", "Campaign01", "600"), ("2019-11-05", "Campaign02", "800"), ("2019-11-05", "Campaign03", "300"), ("2019-11-05", "Campaign04", "300"), ("2019-11-06", "Campaign01", "300"), ("2019-11-06", "Campaign02", "200"), ("2019-11-06", "Campaign03", "400"), ("2019-11-06", "Campaign04", "500");
需求说明
我们需要找出在2019-11-04(记为Time_Stamp_A)和2019-11-06(记为Time_Stamp_B)之间,Expected_Sales发生变动的营销活动,最终输出需要包含:营销活动名称、两个时间点、对应时间点的预期销售额,并且只保留销售额有变化的记录。
现有语句的问题
你当前的查询只是把两个时间点的数据查出来,并给时间点打了标签,但没有将同一营销活动的两个时间点数据横向关联,也没有筛选出销售额变动的记录,所以无法得到目标格式的结果。
修改方案:自连接+筛选
我们可以通过自连接(将表与自身关联)的方式,把同一营销活动在两个时间点的数据匹配到同一行,然后筛选出销售额不同的记录。修改后的SQL如下:
SELECT a.Campaign, a.Time_Stamp AS Time_Stamp_A, b.Time_Stamp AS Time_Stamp_B, a.Expected_Sales AS Expected_Sales_A, b.Expected_Sales AS Expected_Sales_B FROM Sales_Planning a JOIN Sales_Planning b ON a.Campaign = b.Campaign WHERE a.Time_Stamp = '2019-11-04' AND b.Time_Stamp = '2019-11-06' AND a.Expected_Sales != b.Expected_Sales; -- 筛选出销售额变动的记录
结果验证
执行上述SQL后,会得到你期望的结果:
| Campaign | Time_Stamp_A | Time_Stamp_B | Expected_Sales_A | Expected_Sales_B |
|---|---|---|---|---|
| Campaign02 | 2019-11-04 | 2019-11-06 | 300 | 200 |
| Campaign03 | 2019-11-04 | 2019-11-06 | 300 | 400 |
| Campaign04 | 2019-11-04 | 2019-11-06 | 300 | 500 |
补充说明
如果你的数据库支持PIVOT(比如SQL Server),也可以用透视表的方式实现,但自连接的方式兼容性更强,适用于大多数关系型数据库。另外,注意Expected_Sales字段是VARCHAR类型,如果后续有数值比较需求,建议改成INT类型,避免字符串比较带来的问题。
内容的提问来源于stack exchange,提问作者Michi
相关产品推荐
相关产品推荐

