SQL Server:对部分空数据使用聚合

SQL Server:对部分空数据使用聚合,sql,sql-server,tsql,group-by,powerapps,Sql,Sql Server,Tsql,Group By,Powerapps,我有一个问题,一些代码,我想得到一些帮助。以下是从PowerApps进入SQL数据库的表: +-----------------------+-----------------+-------------+-----------+------------+------+-----------+ | ID | ProductionOrder | Workstation | Status | Date | Pass | TotalTime |

我有一个问题,一些代码,我想得到一些帮助。以下是从PowerApps进入SQL数据库的表:


+-----------------------+-----------------+-------------+-----------+------------+------+-----------+
|          ID           | ProductionOrder | Workstation |  Status   |    Date    | Pass | TotalTime |
+-----------------------+-----------------+-------------+-----------+------------+------+-----------+
| 60127429_1000_1_S035  |          108100 | S035        | Completed | 05/13/2020 | No   |       121 |
| 60128523_1000_1_S120  |          884171 | S120        | Completed | 05/13/2020 | Yes  |        18 |
| 60128523_13000_1_S080 |          884172 | S080        | Completed | 05/13/2020 | No   |        26 |
| 60128523_13000_1_S090 |          884172 | S090        | Completed | 05/13/2020 | No   |        19 |
| 60128523_13000_1_S120 |          884172 | S120        | Completed | 05/13/2020 | No   |        16 |
| 60128523_28000_1_S070 |          884173 | S070        | Completed | 05/13/2020 | No   |        10 |
| 60128523_28000_1_S080 |          884173 | S080        | Completed | 05/13/2020 | No   |        16 |
| 60128523_28000_1_S090 |          884173 | S090        | Completed | 05/13/2020 | No   |        21 |
| 60128523_28000_1_S120 |          884173 | S120        | Completed | 05/13/2020 | No   |        17 |
| 60128523_47000_1_S080 |          884174 | S080        | Completed | 05/13/2020 | Yes  |        10 |
| 60128523_47000_1_S090 |          884174 | S090        | Completed | 05/13/2020 | Yes  |        50 |
| 60128523_47000_1_S120 |          884174 | S120        | Completed | 05/13/2020 | Yes  |        19 |
| 60128569_6000_1_S080  |          884698 | S080        | Completed | 05/13/2020 | Yes  |         9 |
| 60128569_6000_1_S090  |          884698 | S090        | Completed | 05/13/2020 | Yes  |        47 |
| 60128569_6000_1_S120  |          884698 | S120        | Completed | 05/13/2020 | Yes  |        54 |
| 60129071_1000_1_S070  |          105597 | S070        | Completed | 05/13/2020 | No   |       137 |
| 60129071_1000_1_S080  |          105597 | S080        | Completed | 05/13/2020 | No   |        12 |
| 60129071_1000_1_S090  |          105597 | S090        | Completed | 05/13/2020 | No   |        21 |
| 60129071_23000_1_S070 |          105598 | S070        | Completed | 05/13/2020 | Yes  |        50 |
| 60129071_23000_1_S080 |          105598 | S080        | Completed | 05/13/2020 | Yes  |        12 |
| 60129071_23000_1_S090 |          105598 | S090        | Completed | 05/13/2020 | Yes  |        29 |
| 60129071_23000_1_S120 |          105598 | S120        | Completed | 05/13/2020 | Yes  |        20 |
| 60129071_23025_1_S020 |          105600 | S020        | Completed | 05/13/2020 | Yes  |        21 |
| 60129151_2000_1_S090  |          104974 | S090        | Completed | 05/13/2020 | No   |        26 |
| 60129151_2000_1_S120  |          104974 | S120        | Completed | 05/13/2020 | No   |        24 |
+-----------------------+-----------------+-------------+-----------+------------+------+-----------+
接下来,我将创建一个视图,通过对每个工作站进行分组来获取一些指标。这是代码:

with cteNow AS 
(
    SELECT CASE WHEN 60 * DATEPART(HOUR, GETUTCDATE()) + DATEPART(MINUTE, GETUTCDATE()) > 60 * 21
            THEN CONVERT(float,(16 - 7) * 60) --minutes in (4 PM - 7 AM) * 60 minutes/hour
        ELSE
            CONVERT(float,60 * DATEPART(HOUR, GETUTCDATE()) + DATEPART(MINUTE, GETUTCDATE()) - ((7 + 5) * 60))
        END as MinutesToday
        , CONVERT(varchar(50), DATEADD(HOUR, -5, GETUTCDATE()), 101) as TargetDate 
)
SELECT dbs.Workstation, 

100.0 - ISNULL(SUM(CASE WHEN dbs.Pass = 'Yes' AND Status = 'Completed' THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN dbs.Status = 'Completed' THEN 1 ELSE 0 END), 0), 0) AS RFT

FROM [Booms DBS] AS dbs LEFT JOIN [Booms Delay Entry] AS del ON dbs.ID = del.ID INNER JOIN cteNow AS N ON N.TargetDate = dbs.[Date]
GROUP BY dbs.Workstation, MinutesToday
这一点是为了测量每个站的“第一次正确”。每次在
Pass
列中有一个“Yes”值时,它就是对RFT的点击。例如,如果给定站点中总共有十个构建,其中五个在
Pass
列中有“Yes”,则表示50%的RFT

但是,
RFT
列的结果总是为“100”。我添加了所有这些
NULLIF
ISNULL
警告,因为有时
Pass
列可能为空,并且在某些天中,可能根本没有任何数据,尤其是在早上。我想这就是问题所在。我计算得不对吗?如果不包含这些空检查函数,我想不出任何其他方法来避免出错或被零除

提前谢谢

这一点是为了测量每个站的“第一次正确”。每次在Pass列中有一个“Yes”值时,它就是对RFT的点击。例如,如果给定站点中总共有十个构建,其中五个在Pass列中有“Yes”,则为50%RFT

似乎您需要条件聚合。我不了解您现有查询中日期算法的用途,但这将实现您所描述的:

select 
    workstation, 
    avg(case when statys = 'Completed' and pass = 'Yes' then 1.0 else 0 end) rft_rate
from dbs.workstation
group by workstation
这将为每个
工作站提供一条记录,数值介于0和1之间,表示在
列中有值
的记录的速率

这一点是为了测量每个站的“第一次正确”。每次在Pass列中有一个“Yes”值时,它就是对RFT的点击。例如,如果给定站点中总共有十个构建,其中五个在Pass列中有“Yes”,则为50%RFT

似乎您需要条件聚合。我不了解您现有查询中日期算法的用途,但这将实现您所描述的:

select 
    workstation, 
    avg(case when statys = 'Completed' and pass = 'Yes' then 1.0 else 0 end) rft_rate
from dbs.workstation
group by workstation
这将为每个
工作站提供一条记录,数值介于0和1之间,表示在
列中有值
的记录的速率