首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >连接相同的表不返回预期的结果。

连接相同的表不返回预期的结果。
EN

Stack Overflow用户
提问于 2018-03-15 21:49:25
回答 2查看 59关注 0票数 0

我有一张有字段和数据的表格,如下所示。

代码语言:javascript
运行
复制
appid     determid      empid   empchargeperc 
1          14           79        1.0
1          15           71        0.42
1          16           70        0.04
1          16           71        0.41
1          16           79        0.13

我想要的是基于最后2个确定id (15和16在上表),我想得到所有的雇主id(埃米特),按照以下3项条件。

  1. 获取所有存在于旧决定(15)而不是新决定(16)中的糖类。产出:无
  2. 获取所有出现在新决定(16)中而不是旧决定(15)中的糖类。输出:埃米尔: 70,79
  3. 比较同一雇主对旧的和新的决定的雇主收费百分比(空收费),如果更改,则退还雇主。如上表所示,对于第15期,只有一个empid 71,因此与决定16中的empid 71和0.42 <> 0.41相比,该雇主也将被退回。

所以我想归还70,71,79。我写了下面的查询,我得到了预期的输出。

代码语言:javascript
运行
复制
SELECT DISTINCT a.appid, a.empid
FROM dbo.emp a JOIN dbo.emp b ON b.appid= a.appid
WHERE a.determid IN (SELECT TOP(2) determid FROM dbo.determ 
WHERE appid = @appid ORDER BY createdate DESC) AND 
a.empchargeperc <> b.empchargeperc

但下表的输出不正确。我得到的埃默斯是47和81,但我认为不应该退货,因为30的决定,47的皮脂匹配,决定了45的空虚47的人。empid 81也一样。

代码语言:javascript
运行
复制
appid     determid      empid   empchargeperc 
1          11           47        0.16
1          11           81        0.83
1          30           47        0.16
1          30           81        0.83
1          45           47        0.16
1          45           81        0.83

任何帮助都会很感激的。

EN

回答 2

Stack Overflow用户

发布于 2018-03-15 21:53:53

从条件的描述来看,这听起来像是带有having子句的聚合:

代码语言:javascript
运行
复制
select empid
from (select d.*, dense_rank() over (order by determid desc) as rnk
      from determ d
     ) d
where rnk <= 2
group by empid
having min(determid) = max(determid) or
       min(empchargeperc) <> max(empchargeperc);
票数 1
EN

Stack Overflow用户

发布于 2018-03-15 22:14:36

你可以用CTE清楚地做复杂的事情--下面我已经用这个技术做了第1和第2步。

代码语言:javascript
运行
复制
WITH NEW_D AS
(
  SELECT MAX(determid) as determnd
  FROM dbo.determ 
  WHERE appid = @appid
), OLD_D AS
(
  SELECT MAX(determid) as determid
  FROM dbo.determ, NEW_D
  WHERE appid = @appid AND determid <> NEW_D.determid
), EMP_NEW AS
(
  SELECT empid
  FROM emp, NEW_D
  WHERE appid = @appid AND determid = NEW_D.determid 
), EMP_OLD AS
(
  SELECT empid
  FROM emp, OLD_D
  WHERE appid = @appid AND determid = OLD_D.determid 
)
SELECT empid
FROM EMP_OLD
WHERE empid NOT IN (SELECT empid FROM EMP_NEW)

UNION ALL

SELECT empid
FROM EMP_NEW
WHERE empid NOT IN (SELECT empid FROM EMP_OLD)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49309818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档