【问题标题】:Oracle SQL: Case in Select overwrites values instead of adding themOracle SQL:选择中的案例覆盖值而不是添加它们
【发布时间】:2017-06-21 12:22:05
【问题描述】:

我是 Oracle 的新手,可能在这里使用了错误的方法。

当前结果:

预期结果:

问题在于,在我的例子中,每个 ID 的文本“项目”而不是第一个项目而不是出现在其上方。

我的查询(简体):

SELECT
    CASE 
        WHEN ROW_NUMBER() OVER (PARTITION BY sd.ID ORDER BY sd.ITEM) = 1 THEN sd.ID
        ELSE '' 
    END AS ID
    , CASE 
        WHEN ROW_NUMBER() OVER (PARTITION BY sd.ID ORDER BY sd.ITEM) = 1 THEN 'Items'
        ELSE sd.ITEM
    END AS Details
    , CASE 
        WHEN ROW_NUMBER() OVER (PARTITION BY sd.ID ORDER BY sd.ITEM) = 1 THEN TO_CHAR((sd.SUBTOTAL + sd.SUBTOTAL_TAX), 'FM9,990.00')
        ELSE '' 
    END AS Total_Price
FROM
    SHIP_DETAILS sd
/* ... */ 

注意:以上截图中的总价只是一个占位符来解释内容,它只是一个总金额。

有人可以告诉我我在这里做错了什么吗?

非常感谢您的帮助,
迈克

【问题讨论】:

  • 去掉单引号。您定义了一个字符串,而不是列引用。
  • @GordonLinoff:谢谢,戈登。我想要每个 ID 的第一行的实际字符串和其他行的列值。我添加了屏幕截图来解释我的意思。这有意义吗?

标签: sql oracle select case partition


【解决方案1】:

评论太长了。

case 语句不会生成 行。因此,您可以在 'item' 或第一项之间进行选择。

我怀疑你想使用grouping sets(或with rollup)。这是一个 article 解释这些 group by 修饰符。

【讨论】:

  • 再次感谢戈登!我明白你的意思。我认为 ROLLUP 是我在这里需要的,因为我试图在每个 ID 的第一项旁边而不是在单独的行上显示小计。将查看文章。
猜你喜欢
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
相关资源
最近更新 更多