【发布时间】:2021-02-09 05:01:16
【问题描述】:
我有一个表 (Oracle SQL),其中包含每个商店位置的商品价格列表的详细信息。我想将多行合二为一——但只有当一个项目的所有行都符合条件时:该项目在所有位置的价格都相同。
数据表(简化)如下所示:
list_id, item_id, location_id, item_price
1 1 1 1.99
1 1 2 1.99
1 1 3 1.99
1 2 1 3.99
1 2 2 3.99
1 2 3 3.99
1 3 1 5.99
1 3 2 7.99
1 3 3 8.99
...我想要这个:
list_id, item_id, location_id, item_price
1 1 0 1.99
1 2 0 3.99
1 3 1 5.99
1 3 2 7.99
1 3 3 8.99
项目 1 和 2 的行已分别合并为一行,位置设置为零(全部)。第 3 项的行保持不变,因为所有位置的价格都不相同。
此查询帮助我确定何时不需要合并项目(存在具有相同 item_id 的两行):
select count(list_id), item_id, item_price
from list_detail
group by item_id, item_price
...但我无法理解它如何适合更大的触发器、脚本或任何可以识别和组合行的东西。
注意:我无法更改表的结构,因为它被许多其他进程所依赖。
您将如何最好地识别并组合所有位置价格相同的行?脚本、触发器、计划的控制台应用程序?
【问题讨论】:
-
任何输入值都可以为 NULL 吗?例如,某件商品在某个位置的价格可以为 NULL 吗?如果是这样,应该如何处理?例如:一个位置的价格为 3.99,而所有其他位置的价格为 NULL - 该组应该怎么办?
-
有一些验证/约束可以防止这些列中的任何一个为 NULL ......但为了使代码健壮或为未来的谷歌用户,我会说这个实现不应该合并行您给出的示例,因为 NULL 3.99。这篇文章的重点是创建数据,后续流程可以使用 location_id==0 从一行中读取数据,然后简单地为所有位置设置相同的商品价格,而不是为该商品处理多个冗余行。这是一个相当大的数据集,因此以这种方式合并可能也会减少存储需求。
-
好的,明白了。但是在某个地方,不知何故,您需要存储有关哪些位置携带该产品的信息;这将消耗(几乎)相同数量的空间。 (我希望你不会通过将一个项目的所有可用位置存储在一个逗号分隔的字符串中来打破第一个正常形式。)然后,回到问题:如果一个特定的价格应该如何处理问题项目(在一个特定列表上)是
null在所有位置?按照你的解释,应该等同于“处处同价”。对吗?
标签: sql oracle count distinct aggregate-functions