【问题标题】:How to go about a column with different values in a same row in sql?如何在sql的同一行中处理具有不同值的列?
【发布时间】:2017-05-23 15:40:36
【问题描述】:

我的桌子有以下结构

empno empname 贷款参考金额 1 ABC 123 100 1 abc 456 200。

即员工可以利用两笔贷款(例如汽车和踏板车)。

预期的输出:

empno empname 贷款 ref1 amt loanref2 amt 1 abc 120 100 456 200

避免重复empno重复。 sql里面怎么弄???

【问题讨论】:

  • 每个 empno 可以有多少重复行?如果这是可变的,则您需要具有可变列数的查询,这是不可能的。另外,你有没有试过什么?请发布您的尝试和遇到的问题。
  • 首先:这是一个可怕的桌子设计。如果您在一个名为“abc”的记录和另一个名为“efg”的记录中找到 empno 1,该怎么办?那么,一个员工可以有多少个条目?你想得到多少列?
  • 另外,为什么要避免表格中的“重复”?重复有什么问题?在这种情况下,它们是完全有效的、正常的和标准的。你没有一些真正的问题需要解决吗?
  • 员工可以有可变数量的恢复。但我们现在不关心他们。我的主要目标是仅获取与 2 次回收相关的数据(即汽车和踏板车贷款)。这 2 个恢复具有不同的参考编号和不同的恢复代码。基本上,当我为每个员工查询数据库时,当员工同时拥有两个贷款时,已经获取了 2 条记录。我需要将结果提取到 excel 文件中并将其交给最终用户。因此,为了减少重复,是否可以将单个员工的 2 行减少到 1 行
  • @Thorsten Kettner:设计就是这样。那么对于上述要求有什么解决方案吗?

标签: sql oracle11g pivot


【解决方案1】:

关于以前的 cmets 表设计 - 事实上,表中存在冗余;您可以将 empname 存储在另一个表中,您将在此处与您的表连接以避免这种情况;每一个冗余都是一个潜在的矛盾。 但是,如果我们有一个针对查询和最小化必要连接进行优化的表设计,它可能会从其他地方以批处理作业的形式填充,然后该设计将是合适的。

您要在此处执行的操作通常称为“水平旋转”。 我们这里缺少一些信息,所以我假设最大贷款数量为 2。我们需要一种机制,允许我们将数据放入 col1 或 col2,具体取决于它是同一 empno 的第一行还是第二行。这就是我们生成序列号的原因。最后,我们使用 SUM(CASE seq WHEN ...) 表达式结合 GROUP BY 来减少行数并展平表格。

这里是:

-- first global table expression - the input table
-- The table could exist already, and then this would not be needed.
WITH foo(empno,empname,loanref,amount) AS (
          SELECT  1,'abc',123,100
UNION ALL SELECT  1,'abc',456,200
)
-- second global table expression - add sequence number
-- this needs to be in the query
,    foo_numbered AS (
SELECT
  -- need a number: 1 for the first, 2 for the second loan
  ROW_NUMBER() OVER(PARTITION BY empname ORDER BY loanref) AS seq
, *
FROM foo
)
SELECT
  empno
, empname
, MAX(CASE seq WHEN 1 THEN loanref END) AS loanref_1
, SUM(CASE seq WHEN 1 THEN amount END) AS amount_1
, MAX(CASE seq WHEN 2 THEN loanref END) AS loanref_2
, SUM(CASE seq WHEN 2 THEN amount END) AS amount_2
FROM foo_numbered
GROUP BY
  empno
, empname
;

玩的开心

马可

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2015-07-17
    相关资源
    最近更新 更多