Oracle 的棘手视图
我有一个包含以下列的“价格”表:(
year, janprc, janqty, febprc, febqty ...
一年中所有月份的价格和数量)
我需要的是创建一个包含以下列的视图“每月价格”:
year, month, price, quantity
使用上表中的数据。 我怎么能那样做呢?
谢谢!
I have a table "prices" with columns :
year, janprc, janqty, febprc, febqty ...
(prices and quantyties for all the months in a year)
what I need is to create a view "monthlyprices" with the columns :
year, month, price, quantity
using data from the table above.
how could i do that ?
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
以下是如何使用一个 UNPIVOT 语句而不使用 UNION 来完成此操作。
Here is how to do it with one UNPIVOT statement and no UNIONs.
这与编写 12 个子查询并将其结果
UNION
组合在一起非常简单:您可以使用
UNION ALL
因为您知道不会有任何重复项。It's pretty much as simple as writing 12 sub-queries and
UNION
ing their results together:You can use
UNION ALL
because you know that there will not be any duplicates.使用 11 个 UNION 一次构建您想要一个月的表,
这假设没有超过一条记录每年。如果每年有多个记录,请使用 UNION ALL 保留重复的行。
Use 11 UNIONs to build the table you want one month at a time,
This assumes there is no more than one record per year. If there is more than one record per year use UNION ALL to preserve duplicate rows.
您或许可以利用 Oracle 11g 的 UNPIVOT 操作,我没有 11g 实例尽管我很害怕,但我还是在四处进行测试。
You might be able to make use of Oracle 11g's UNPIVOT operation, I don't have an 11g instance kicking around to test against though I'm afraid.
工会的做法对我来说看起来有点痛苦。您可以这样做,将真实的表名替换为 so_4164416 并选择您想要表示月份的方式 - 也许不是全名(而且我怀疑无论如何都有更好的方法来生成月份名称!):
The union approach looks a bit painful to me. You can do it like this, replacing your real table name for so_4164416 and choosing the way you want to represent the months - maybe not full names (and I suspect there's a better way to generate the month names anyway!):
如果
UNPIVOT
可用,您绝对应该使用它。对于早期版本的 Oracle,您可以将表与月份名称表(生成的或预构建的)交叉连接,然后使用解码或 case 语句选择正确的月份、价格和数量。这是它的样子。If
UNPIVOT
is available, you should definitely use that. For earlier versions of Oracle you could cross join your table with a table of the month names (generated or prebuilt) and then use decode or case statements to select the correct month, price, and quantity. Here is how this would look.