【问题标题】:Getting a value where 3 other values (different column) find that particular value获取一个值,其中 3 个其他值(不同的列)找到该特定值
【发布时间】:2015-07-21 22:25:05
【问题描述】:

我要做的是找到一个日期和 trans_id,其中 item_nbr = 1、2 和 3(无特定顺序)。必须使用相同的 trans_id 找到所有 3 个项目。

所以表格看起来像这样:

trans_id, trans_date, item_nbr, item, price

表格如下:

trans_id--trans_date--item_nbr--item--price    
1234--1/1/2015--1--item1--1.00   
1234--1/1/2015--3--item3--3.00    
1234--1/1/2015--2--item2--2.00    
4321--1/1/2015--2--item2--2.00

结果应该是:

1/1/2015--1234

不过,查询应该只返回日期和 trans_id。

所以这就是我到目前为止所拥有的,但我知道这是不正确的,因为它会撤回所有包含项目 1、2 和/或 3 的日期/trans_id,而不是同一日期和 trans_id 中的 1、2、3。

select date, trans_id
from table1
where item in ('item1', 'item2', 'item3')

非常感谢您的帮助。

【问题讨论】:

    标签: sql teradata


    【解决方案1】:
    select date, trans_id
    from table1
    where item in ('item1', 'item2', 'item3')
    group by 1,2
    having count(*) = 3
    

    如果item 不是唯一的,则必须使用

    having count(distinct item) = 3
    

    【讨论】:

    • 在有语句中使用 'distinct' 时我得到零结果。当我删除 'distinct' 时,我继续得到所有结果 - 而不仅仅是所有 3 个项目都存在的记录。有什么想法吗?
    • @DJDJ23:您可以将date 更改为MIN(date) 并将其从GROUP BY 中删除,以检查它是否实际上是同一日期。
    【解决方案2】:

    您可以计算不同的值

    ;WITH cte (trans_id) AS (
         SELECT trans_id
         FROM table1 
         Group By trans_id 
         Having Count(distinct item_nbr) = (Select Count(Distinct item_nbr) from table1))
    
    Select DISTINCT trans_id, trans_date 
    From table1 
    Where trans_id IN (
    Select trans_id from  cte)
    

    Select DISTINCT trans_id, trans_date 
        From table1 
        Where trans_id IN (
        SELECT trans_id
             FROM table1 
             Group By trans_id 
             Having Count(distinct item_nbr) = (Select Count(Distinct item_nbr) from table1))
    

    【讨论】:

      【解决方案3】:

      你需要的是这样的:

      select date, trans_id
      from table1
      where item in ('item1', 'item2', 'item3')
      group by date, trans_id
      

      让我知道这是否有效!

      编辑:我的错误列错了!

      【讨论】:

      • 我知道你的意思。 :) 结果为零。我知道第 1、2、3 件物品在同一笔交易中都售出过几次。还有其他想法吗?
      【解决方案4】:

      你很接近。只需使用group byhaving

      select date, trans_id
      from table1
      where item in ('item1', 'item2', 'item3')
      group by date, trans_id
      having count(distinct item) = 3;
      

      编辑:

      如果having count(distinct item) = 3 没有返回任何结果,那么您不会遇到所有三个项目在同一日期在同一事务中的情况。

      您可以考虑从selectgroup by 中删除date。那里好像很尴尬。我只留下它,因为它在您问题的查询中。

      【讨论】:

      • 在有语句中使用 'distinct' 时我得到零结果。当我删除 'distinct' 时,我继续获得所有结果 - 而不仅仅是所有 3 个项目都存在的记录。有什么想法吗?
      【解决方案5】:

      所以,我找到了解决方案。不确定这是否是最有效的,但我决定为每个项目创建一个 volatile 表,然后根据 date、trans_id 和我的示例中未提及的一些其他字段查询 3 个 volatile 表。

      感谢大家的帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-27
        • 1970-01-01
        • 1970-01-01
        • 2020-03-23
        • 1970-01-01
        相关资源
        最近更新 更多