[英]How to loop over different values in SQL and create a new row for it?
我有以下数据表:
物品 | 基本价格 | 价格 | 价位表 |
---|---|---|---|
一种 | 1个 | 1个 | - |
乙 | 1个 | 1个 | - |
C | 1.5 | 1.5 | - |
丁 | 1.5 | 1.5 | - |
一种 | 1个 | 1.5 | 01 |
乙 | 1个 | 1.5 | 01 |
一种 | 1个 | 1.25 | 02 |
C | 1.5 | 1.25 | 02 |
丁 | 1.5 | 1.25 | 03 |
当您按 item 对这些数据进行排序时,您会看到:
物品 | 基本价格 | 价格 | 价位表 |
---|---|---|---|
一种 | 1个 | 1个 | - |
一种 | 1个 | 1.5 | 01 |
一种 | 1个 | 1.25 | 02 |
乙 | 1个 | 1个 | - |
乙 | 1个 | 1.5 | 01 |
C | 1.5 | 1.5 | - |
C | 1.5 | 1.25 | 02 |
丁 | 1.5 | 1.5 | - |
丁 | 1.5 | 1.25 | 03 |
它很好地概述了每个价目表的价格。
现在我想查询每个价目表的项目。 问题是,如果没有特定的价格表条目,则没有价格表的项目需要出现在每个结果中,价格的值为基本价格。
我希望结果数据看起来像这样:
物品 | 基本价格 | 价格 | 价位表 |
---|---|---|---|
一种 | 1个 | 1个 | - |
一种 | 1个 | 1.5 | 01 |
一种 | 1个 | 1.25 | 02 |
一种 | 1个 | 1个 | 03 |
乙 | 1个 | 1个 | - |
乙 | 1个 | 1.5 | 01 |
乙 | 1个 | 1个 | 02 |
乙 | 1个 | 1个 | 03 |
C | 1.5 | 1.5 | - |
C | 1.5 | 1个 | 01 |
C | 1.5 | 1.25 | 02 |
C | 1.5 | 1个 | 03 |
丁 | 1.5 | 1个 | - |
丁 | 1.5 | 1个 | 01 |
丁 | 1.5 | 1个 | 02 |
丁 | 1.5 | 1.5 | 03 |
所以基本上,如果我查询价目表,我会返回所有存在的项目,如果它们不在查询的价目表中,则会填充基本价格。
我无法理解这个问题。 我尝试使用联接,但最终得到了多列。 我认为有一种更简单的方法。
PS 可用价目表的数量是动态的。
你的数据库设计不好。 尽管每个项目只有一个基价,但您将基价存储在价目表中。 这种冗余违反了数据库规范化,您应该在遇到任何问题之前更改它。
这是三个规范化表(主键斜体):
然后是任务:您希望每个项目和价目表有一个结果行。 您可以通过将所有项目与所有价目表交叉连接来获得此信息。 然后外部加入价格表。
select
i.item_no,
i.base_price,
coalesce(p.price, i.base_price) as price
pl.price_list_no,
from items i
cross join price_lists pl
left outer join prices p on p.item_no = i.item_no
and p.price_list_no = pl.price_list_no
order by i.item_no, i.base_price;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.