【问题标题】:Selecting Values from Table as Column Headers从表中选择值作为列标题
【发布时间】:2013-11-09 06:10:25
【问题描述】:

我有一个结构如下的表:

ID  KEY     VALUE   SEQ
1   Amount  5       2   
1   Amount  4       1
1   Type    T1      2   
1   Type    T1      1
2   Amount  10      2   
2   Amount  5       1
2   Type    T2      2
2   Type    T2      1

我想创建一个查询来得到这个:

ID  Amount  Type
1   5       T1
2   10      T2

如您所见,(ID, Key) 可能有多种组合,但 (ID, Key, Seq) 是唯一的。

SELECT  T.ID, 
        T1.VALUE as Amount, 
        T2.VALUE as Type
FROM 
    (SELECT ID, MAX(SEQ) as MAXSEQ FROM TABLE GROUP BY ID) as T
    JOIN
        TABLE as T1
            ON T1.ID = T.ID
            AND T1.KEY = 'Amount'
            AND T1.SEQ = MAXSEQ
    JOIN
        TABLE as T2
            ON T2.ID = T.ID
            AND T2.KEY = 'Type'
            AND T2.SEQ = MAXSEQ

但我得到了我没想到的结果

ID  Amount  Type

    1   5       T1
    1   4       T1
    1   10      T1
    1   5       T1
    2   10      T2
    2   5       T2
    2   4       T2
    2   5       T2

我已经阅读了这篇文章,但它不适用于我的案例,尽管它有助于here

知道谁来解决这个问题吗?

【问题讨论】:

  • 我想我得到了想要的结果。 sqlfiddle.com/#!3/f3e87/1我错过了什么吗?
  • 感谢 cmets Andrew.. 您在示例中使用了 sql server。我正在使用甲骨文

标签: sql oracle


【解决方案1】:

the linked question 中缺少的东西是 DISTINCT 关键字。

另见the query posted by ypercube下面的解释。事实上,你得到了重复,因为你正在加入一个表本身。因此,行将被镜像。

您的子查询应该是:

(SELECT DISTINCT ID, MAX(SEQ) as MAXSEQ FROM TABLE GROUP BY ID) as T

【讨论】:

  • 并非如此。通过按 id 分组,我将获得与 DISTINCT 相同的效果。
【解决方案2】:
SELECT 
  id, amount, type
FROM TABLE1
  natural join (SELECT ID, MAX(SEQ) as SEQ FROM TABLE1 GROUP BY ID) 
pivot (
  max(VALUE) for key in ('Amount' as amount, 'Type' as type)
)

fiddle

【讨论】:

    【解决方案3】:

    我意识到还有另一列我没有提出问题(以避免给出真实数据),这会影响结果。唯一约束是 (ID, Key, Seq, Time) 而不是 (ID, Key, Seq)。正如@Andrew 提到的,查询返回了正确的结果。

    查询又来了

    SELECT  T.ID, 
            T1.VALUE as Amount, 
            T2.VALUE as Type
    FROM 
        (SELECT ID, MAX(SEQ) as MAXSEQ FROM TABLE GROUP BY ID) as T
        JOIN
            TABLE as T1
                ON T1.ID = T.ID
                AND T1.KEY = 'Amount'
                AND T1.SEQ = MAXSEQ
        JOIN
            TABLE as T2
                ON T2.ID = T.ID
                AND T2.KEY = 'Type'
                AND T2.SEQ = MAXSEQ
    

    感谢 Andrew 的澄清和 sqlfiddle。如果我浪费了任何人的时间,我深表歉意。

    【讨论】:

      猜你喜欢
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多