如何解决没有额外记录的查询
我在 Business Objects 中遇到查询问题。我的表记录了由 ID、客户端、状态和日期标识的事件。一个客户端可以有如下两种打开和关闭状态
我选择的客户 1 重复注册是
SELECT T1.ID,T1.CLIENT,T1.DATE AS DATE_OPEN,CASE WHEN T2.STATE = 'CLOSE' THEN T2.DATE END AS DATE_CLOSE
FROM MYTABLE T1
inner join MYTABLE T2
on (T1.CLIENT = T2.CLIENT)
where T1.STATE='OPEN' AND T2.STATE IN ('OPEN','CLOSE');
请问,您能帮我实现一个没有 ID=111 的查询吗??
解决方法
我相信你想要这样的东西:
SELECT T1.ID,T1.CLIENT,T1.DATE AS DATE_OPEN,CASE WHEN T2.STATE = 'CLOSE' THEN T2.DATE END AS DATE_CLOSE
FROM MYTABLE T1
LEFT OUTER JOIN MYTABLE T2
ON (T1.CLIENT = T2.CLIENT)
AND t2.state = 'CLOSE'
WHERE T1.STATE='OPEN';
请注意,这将“删除”333 ID 行,但 111 ID 行应该像我相信您正在寻找的那样填充 DATE_CLOSE。如果你真的需要去掉 111 行,你可以在选择中用 T1.ID
替换 CASE WHEN T2.STATE='CLOSE' THEN T2.ID ELSE T1.ID END AS ID
。
我在这里做了几个假设,包括:
- 您显示的表格是您当前获得的输出(并且每个客户端只需要一行)
- 您的数据模型每个“事件”都有一行:ID、CLIENT、DATE、STATE
我认为你只想要这样的left join
:
SELECT T1.ID,T2.DATE AS DATE_CLOSE
FROM MYTABLE T1 LEFT JOIN
MYTABLE T2
ON T1.CLIENT = T2.CLIENT AND t2.STATE = 'Close'
WHERE T1.STATE = 'OPEN' ;
也就是说,我可能还建议聚合:
select min(id),client,min(date) as date_open,nullif(max(date),min(date)) as date_close
from mytable t
group by client;
这假设开放日期小于关闭日期。它还假定较小的 id 用于打开。这两个都可以使用条件逻辑来处理,但这种逻辑似乎没有必要。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。