基于分子中特定条件的平均值
Posted
技术标签:
【中文标题】基于分子中特定条件的平均值【英文标题】:Average based on certain condition in the numerator 【发布时间】:2019-06-21 09:11:02 【问题描述】:我有两个表 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 = .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
有人可以告诉我如何获得吗?
【问题讨论】:
到底有什么不正确的?提供预期结果的样本数据 请表定义 你得到的结果不依赖于日期,因为你的子查询不依赖于它。要获得您想要的内容,请向它们添加a.[Billed Date]
参数。如果ROS
tble 没有与a.[Billed Date]
比较的日期列,则坚持CASE
版本
我尝试再添加一个条件,其中我也使用 DN 和 JCN 加入:但现在我得到“除以零错误”。错误,请告诉我为什么我需要使用“日期”列添加,是的,ROS 中没有日期列。
如果ROS
中没有日期列,则您的ROS
-subquery 版本与问题无关,因为您希望获得与日期相关的结果。 case
版本有什么问题?
【参考方案1】:
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
【讨论】:
以上是关于基于分子中特定条件的平均值的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas Dataframe - 基于条件的分组和平均值