SQL,查找两个给定名称在一列中是不是具有相同数字的查询

Posted

技术标签:

【中文标题】SQL,查找两个给定名称在一列中是不是具有相同数字的查询【英文标题】:SQL, query that finds if two given names have the same number in one columnSQL,查找两个给定名称在一列中是否具有相同数字的查询 【发布时间】:2019-08-20 00:59:49 【问题描述】:

我已经尝试解决这个问题大约一个星期了。我真的需要别人的帮助。

我将获得两个或三个“LN”,我必须检查它们在“FODEX”列中是否具有相同的编号。如果它们具有相同的 FODEX,则可能只需添加一列并打印一列,否则打印零。

我写了这个查询:

 SELECT  MSTR.LN , LINK.SEQNO, MMA5_MSTR.FODEX, MMA5_MSTR.DES, MSTR.SL
 FROM  (((MSTR INNER JOIN LINK
 ON MSTR.SEQNO = LINK.SEQNO) INNER JOIN MMA5_MSTR
 ON LINK.FODEX = MMA5_MSTR.FODEX))
 WHERE (MSTR.LN LIKE "%NOVOLLL%" OR MSTR.LN LIKE "%TRES%" OR MSTR.LN LIKE 
 "%ENBREL%")
 GROUP BY SEQNO, SL
 ORDER BY FODEX;

这是我得到的输出,

  LN       || SEQNO       ||   FODEX  ||     DES     ||  SL
 ----------------------------------------------------------------   
 TRES      || 71842       ||    13    ||  ANTIDIABE  ||  12
 NOVOLLL   || 44340       ||    13    ||  ANTIDIABE  ||  12
 NOVOLLL   || 44340       ||   1059   ||  ANTIDIABE  ||  55
 TRES      || 71842       ||   1059   ||  ANTIDIABE  ||  55
 TRES      || 71842       ||   1317   ||  ANTIDIABE  ||  66
 NOVOLLL   || 44340       ||   1317   ||  ANTIDIAB   ||  66
 ENBREL    || 40869       ||   1722   ||  TNe        ||  90
 ENBREL    || 40869       ||   29359  ||  IMMUNOSUPP ||  103

这是我想要得到的输出,

  LN       || SEQNO       ||   FODEX  ||     DES     ||  SL || Y/N
 ----------------------------------------------------------------   
 TRES      || 71842       ||    13    ||  ANTIDIABE  ||  12 || 1
 NOVOLLL   || 44340       ||    13    ||  ANTIDIABE  ||  12 || 1
 NOVOLLL   || 44340       ||   1059   ||  ANTIDIABE  ||  55 || 1
 TRES      || 71842       ||   1059   ||  ANTIDIABE  ||  55 || 1
 TRES      || 71842       ||   1317   ||  ANTIDIABE  ||  66 || 1
 NOVOLLL   || 44340       ||   1317   ||  ANTIDIAB   ||  66 || 1
 ENBREL    || 40869       ||   1722   ||  TNe        ||  90 || 0
 ENBREL    || 40869       ||   29359  ||  IMMUNOSUPP ||  103|| 0

【问题讨论】:

额外列的预期结果是什么?您可以将其添加到示例中吗? 我确实将它添加到示例中。 @YousefSameer。 . .您的聚合查询没有意义。您在SELECT 中有未聚合的列——即SELECT 列和GROUP BY 列不一致。 【参考方案1】:

我认为你可以用聚合做你想做的事:

SELECT MSTR.LN,
       MAX(MMA5_MSTR.FODEX) = MIN(MMA5_MSTR.FODEX) as is_same_flag
FROM MSTR INNER JOIN
     LINK
     ON MSTR.SEQNO = LINK.SEQNO INNER JOIN
     MMA5_MSTR
     ON LINK.FODEX = MMA5_MSTR.FODEX
WHERE MSTR.LN LIKE '%NOVOLLL%' OR
      MSTR.LN LIKE '%TRES%' OR
      MSTR.LN LIKE '%ENBREL%'
GROUP BY LN;

这不会添加额外的列,但它似乎可以满足您的需求。

【讨论】:

您能否检查一下我添加到问题中的输出示例。非常感谢您的帮助【参考方案2】:

也许是一种稍微不同的方法,子查询确定有多少符合条件的 fodex,而主查询检查它们。请注意,南瓜与一些符合条件的 ln 共享一个 fodex,但与 1722 一样,它的值为 0,因为只有 1 个 ln

drop table if exists t;
create table t
(LN  varchar(20), SEQNO int,  FODEX  int);
insert into t values
 ('TRES'      , 71842       ,    13    ),
 ('NOVOLLL'   , 44340       ,    13    ),
 ('NOVOLLL'   , 44340       ,   1059   ),
 ('TRES'      , 71842       ,   1059   ),
 ('TRES'      , 71842       ,   1317   ),
 ('NOVOLLL'   , 44340       ,   1317   ),
 ('ENBREL'    , 40869       ,   1722   ),
 ('ENBREL'    , 40869       ,   29359 ),
 ('tres'    , 40869       ,     29359 ),
 ('pumpkin'    , 40869       ,  29359)  ;


select ln,seqno,cntin,t.fodex,
        case when ln in ('tres','novolll','enbrel') and cntin > 1 then 1 
            when ln not in ('tres','novolll','enbrel') then 0
            when cntin <= 1 then 0
        end as 'y/n'
from t
join
(select fodex, sum(case when ln in ('tres','novolll','enbrel') then 1 else 0 end) as cntin 
    from t 
    group by fodex) s
on t.fodex = s.fodex
order by t.fodex
;

+---------+-------+-------+-------+------+
| ln      | seqno | cntin | fodex | y/n  |
+---------+-------+-------+-------+------+
| TRES    | 71842 |     2 |    13 |    1 |
| NOVOLLL | 44340 |     2 |    13 |    1 |
| NOVOLLL | 44340 |     2 |  1059 |    1 |
| TRES    | 71842 |     2 |  1059 |    1 |
| NOVOLLL | 44340 |     2 |  1317 |    1 |
| TRES    | 71842 |     2 |  1317 |    1 |
| ENBREL  | 40869 |     1 |  1722 |    0 |
| ENBREL  | 40869 |     2 | 29359 |    1 |
| tres    | 40869 |     2 | 29359 |    1 |
| pumpkin | 40869 |     2 | 29359 |    0 |
+---------+-------+-------+-------+------+
10 rows in set (0.00 sec)

【讨论】:

以上是关于SQL,查找两个给定名称在一列中是不是具有相同数字的查询的主要内容,如果未能解决你的问题,请参考以下文章

sql 在集合中查找(多个值在一列中像字符串一样存在)

SQL如何批量更新某列中一个字符为另一个字符

SQL:在一列中获取最小值和最大值

SQL如何将某一列中相同的数据合并

查找一列中具有相同值而另一列中具有其他值的行?

SQL 将 2 个表合并在一列中,以逗号分隔