非常熟悉SQL。
我的表包含访问要求,两种类型都保存在同一个表中。记录可以是'ADP'或发送‘’或--两者都是。我需要返回一个值来输入另一个查询。
当两种访问类型都存在时,SELECT查询返回2行,那么如何编码它以返回单个值。因此,如果ADP只存在,我得到ADP,如果被发送,我只得到,而,如果ADP和SENT都被发现,我只能被发送。
我的表包含了许多字段,但本质上如下所示
SUA_PERUSER_ID SUA_ACCESS_TYPE
10000000 ADP
10000001 SENT
10000002 ADP
10000002 SENT我的疑问是
SELECT S_USER_ACCESS.SUA_PERUSER_ID, S_USER_ACCESS.SUA_ACCESS_TYPE
FROM S_USER_ACCESS
WHERE S_USER_ACCESS.SUA_PERUSER_ID = <Client_ID> 其中<client_ID>由用户输入。
发布于 2016-11-01 12:23:35
正如Massimo所说,您需要group by sua_peruser_id才能得到一个值。或者,如果只需要对一个sua_peruser_id执行此操作,则将有一个where子句(而不需要group by)。
如果您不想使用按字母顺序排列的'SENT' > 'ADP'的意外,您可以这样做(代码更多,但出错的可能性更小):
select sua_peruser_id,
max(sua_access_type) keep (dense_rank first order by
case sua_access_type when 'SENT' then 1
when 'ADP' then 2
end) as sua_access_type
from s_user_access
group by sua_peruser_id如果您有两个以上的可能值,SENT和ADP,一个更好的解决方案是将这些可能的值放在一个单独的表中,并在第二列中列出它们的优先级顺序。但是,在您的特定用例中,这可能是过度使用。
编辑--仍在等待OP澄清修改后的需求。如果同时存在'SENT'和'ADP',则结果应该显示'BOTH'而不是'SENT'。最好使用聚合函数min()和max()来完成。有两个版本--如果保证每个'SENT'和'ADP'只出现一次以上的话,一个更简单的版本;如果可能的话,一个更复杂的版本。下面我展示了更复杂的版本,它适用于更一般的情况。
select sua_peruser_id,
case when min(sua_access_type) != max(sua_access_type) then 'BOTH'
else min(sua_access_type)
end as sua_access_type
from s_user_access
where sua_peruser_id = <customer_id> -- (provided by user)发布于 2016-11-01 12:09:12
将您的字段称为"access_type“和表”access“,并对字段”所有者“的存在进行成像,您可以尝试使用这种脏的sql。
select max(access_type) , owner from access group by owner它有点脏,并且使用了一个事实,即词汇发送是大于ADP的
编辑需要三个结果,它变化很大:
select decode (sum(partial.cnt),1,'ADP',2,'SENT',3,'BOTH') access_type, patial.owner from (
select decode(access_type,'ADP', 1,'SENT',2,0) cnt, access_type, owner from access ) partial
group by partial.owner部分子查询将access_type转换为数字,外部查询解码结果之和。约束条件是,每个‘所有者’不应该超过2行。
对不起,如果有一些sql错误,因为我现在没有要测试的sql控制台
发布于 2016-11-01 12:01:39
如果ADP和SENT是同一表中的两列,其中一列可能为null,则使用NVL()函数:
SELECT NVL(SENT, ADP) FROM ....
如果发送的值为null,上述值将计算为已发送的值。否则,它将评估ADP的价值。
https://stackoverflow.com/questions/40359575
复制相似问题