【问题标题】:How to get Null values for more than 1 transaction for an ID IN SQL? Working with two Fact tables如何为 ID IN SQL 获取超过 1 个事务的 Null 值?使用两个事实表
【发布时间】:2021-07-03 03:32:09
【问题描述】:

我正在尝试通过使用唯一键连接两个表来获得结果。

主题表

KEY OCCURS Value
YMPRQ72 1 21
YMPRQJX 1 7

消费者表

KEY TYPE ITEM_ID AMT
YMPRQJX No Charge 1106 0
YMPRQ72 Deluxe 20883 40
YMPRQJX Basic 20889 20
YMPRQ72 No Charge 1106 0

结果

KEY TYPE ITEM_ID AMT OCCURS VALUE
YMPRQJX No Charge 1106 0 1 7
YMPRQ72 Deluxe 20883 40 1 21
YMPRQJX Basic 20889 20 1 7
YMPRQ72 No Charge 1106 0 1 21

您可以在结果中看到每个Key OCCURS 应该只出现一次,Value 也是如此。由于两个唯一值,我希望将 Subjects 总数设为 2,但唯一值与 TYPE 中的多个值匹配。

期望/预期结果

KEY TYPE ITEM_ID AMT OCCURS VALUE
YMPRQJX No Charge 1106 0 - -
YMPRQ72 Deluxe 20883 40 1 21
YMPRQJX Basic 20889 20 - -
YMPRQ72 No Charge 1106 0 1 21

我用于 ORACLE 数据库的代码是:

SELECT c.KEY, c.TYPE, c.ITEM_ID, c.AMT, s.OCCURS, s.VALUE 
FROM CONSUMER c LEFT JOIN SUBJECT s ON c.KEY = s.KEY

【问题讨论】:

  • 如何选择哪些行获取值?

标签: sql database oracle


【解决方案1】:

您可以使用ROW_NUMBER() 枚举行,然后使用CASE 表达式将值仅放在每个KEY 的一行上。不清楚你想要哪一行,只是键的最后一行有值:

SELECT C.KEY, C.TYPE, C.ITEM_ID, C.AMT,
       (CASE WHEN seqnum = 1 THEN S.OCCURS END) as OCCURS, 
       (CASE WHEN seqnum = 1 THEN S.VALUE END) as VALUE
FROM (SELECT C.*,
             ROW_NUMBERI() OVER (PARTITION BY C.KEY ORDER BY NULL) as seqnum
      FROM CONSUMER C 
     ) C LEFT JOIN
     SUBJECT
     ON C.KEY = S.KEY
ORDER BY C.KEY, seqnum DESC;

【讨论】:

    【解决方案2】:

    如果您只想获取与“KEY”相关的值,那么它肯定会返回该 KEY 上的所有记录,因为有两个唯一值,但唯一值与您所说的 TYPE 中的多个值匹配,尝试使用联接而不是左联接:

    SELECT CONSUMER.KEY, CONSUMER.TYPE, CONSUMER.ITEM_ID, CONSUMER.AMT,
    SUBJECT.OCCURS, SUBJECT.VALUE
    FROM CONSUMER
    JOIN SUBJECT ON CONSUMER.KEY = SUBJECT.KEY;
    

    如果您不想让 KEY 重复并且每个 KEY OCCURS 的结果应该只出现一次,可以通过将 WHERE 语句中的 TYPE 定义为:

    SELECT CONSUMER.KEY, CONSUMER.TYPE, CONSUMER.ITEM_ID, CONSUMER.AMT,
    SUBJECT.OCCURS, SUBJECT.VALUE
    FROM CONSUMER
    JOIN SUBJECT ON CONSUMER.KEY = SUBJECT.KEY
    WHERE CONSUMER.TYPE = "No Charge";
    

    【讨论】:

    • 感谢您的建议。 @Ramisha- 加入没用,我已经用过了。
    • @gordan- 我理解这种方法。我使用排名来做到这一点,但是对于数百万行的数据,它需要三倍的时间。另外-我想要这两行,但仅在其中一个具有重复项的键中显示发生和值。有什么建议吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    相关资源
    最近更新 更多