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,查找两个给定名称在一列中是不是具有相同数字的查询的主要内容,如果未能解决你的问题,请参考以下文章