基于分子中某些条件的平均值

时间:2019-06-21 09:11:02

标签: sql sql-server join correlated-subquery

我有两个表WIP和ROS,两个表都有很多列,但所需的主要列是 Branch,Date,LC和'DN'和'JCN'用于连接两个表,并且输出应采用以下格式 分支,日期,计数(*根据条件而定)/计数(*)

如前所述,两个表都有很多列,但对于我的查询:WIP包含Branch,Status,Date和DN列,ROS包含Branch,LC和JCN列

我使用了如下的case case语句:

select a.Branch,[Billed Date],avg(case when LC in 
('A22D','SB15','SB16','AT01','AT02','AT03') then 1.0 else 0 end)
from WIP a join ROS b on a.DN = b.JCN
where a.[Status] = 'BILLED' and SUBSTRING(a.DN,1,3) = 'XJC'
group by a.Branch,[Billed Date]
order by 1,2

我试图在不使用case语句的情况下使用联接和相关子查询获取结果

我使用了以下查询,但是得到的结果不正确。

 select a.Branch,[Billed Date], 
            1.0*(select count(*) from ROS where LC in ('A22D','SB15','SB16','AT01','AT02','AT03') and c.Branch = 
 a.Branch )/(select count(*) from ROS d where d.Branch = a.Branch)
 from WIP a join ROS b on a.DN = b.JCN
 where a.[Status] = 'BILLED' and SUBSTRING(a.DN,1,3) = 'XJC'
 order by 1,2

我希望输出为:

 Branch     Date      Average_Jobs
   A     2019-06-01       0.11
   B     2019-06-01       0.09
   C     2019-06-01       0.12
   A     2019-06-02       0.12
   B     2019-06-02       0.10
   C     2019-06-02       0.13

其中平均列是根据每个分支机构和每天的A22D,SB15,SB16,AT01,AT02,AT03等LC总数除以LC总数得出的。

我正在通过相关子查询获得低于输出的输出,我知道平均数字都错了:

Branch  Date        Avg
A   2019-06-01  0.032258065
A   2019-06-02  0.032258065
A   2019-06-03  0.032258065
A   2019-06-04  0.032258065
A   2019-06-05  0.032258065
A   2019-06-06  0.032258065
B   2019-06-01  0.032183908
B   2019-06-02  0.032183908
B   2019-06-03  0.032183908
B   2019-06-04  0.032183908
B   2019-06-05  0.032183908
B   2019-06-06  0.032183908
C   2019-06-01  0.032183908
C   2019-06-02  0.032183908
C   2019-06-03  0.032183908
C   2019-06-04  0.032183908
C   2019-06-05  0.032183908
C   2019-06-06  0.032183908

*****编辑: 我需要对查询进行修改,因为在手动检查后它没有给我正确的结果。问题在于DN是主键,而JCN是外键,在EX的LC列下有很多重复项:

 WIP Table           ROS Table
    DN             JCN        LC
    11A            11A        A21X
    12A            11A        SB15
     .             11A        AT09
     .             11A        A22A 
     .             12A        A22A
     .             12A        AT11  
                   12A        SB01  

我的查询输出显示平均值为14.28%,因为在7行中,第二行的条件为“ SB15”。而我需要的平均值是50%。这是因为在DN列下有两个条目:11A和12A,并且只有其中一个具有我们感兴趣的LC,即“ SB15”。因此,平均值为50%的1/2 = 0.5。我知道我需要取JCN或DN的DISTINCT值的比率以获得正确的结果,我按如下方式使用DISTINCT,但未获得正确的结果:

 select a.Branch,[Billed Date],avg(case when LC in 
 ('A22D','SB15','SB16','AT01','AT02','AT03') then 1.0 else 0 end)
 from WIP a join (select distinct JCN,LC from ROS) b on a.DN = b.JCN
 where a.[Status] = 'BILLED' and SUBSTRING(a.DN,1,3) = 'XJC'
 group by a.Branch,[Billed Date]
 order by 1,2    

有人可以让我知道该怎么做吗?

1 个答案:

答案 0 :(得分:0)

SELECT
  all_fields.*
FROM
  (
    SELECT
      Branch,
      MAX(Date)
    FROM
       yourtable
    GROUP BY
      Branch
   ) AS max_recs
LEFT OUTER JOIN yourtable AS all_fields ON max_recs.id = all_fields.id