Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 同一查询中的不同聚合字段_Sql_Sql Server_Group By - Fatal编程技术网

Sql 同一查询中的不同聚合字段

Sql 同一查询中的不同聚合字段,sql,sql-server,group-by,Sql,Sql Server,Group By,我试图在同一查询中使用分区以不同的方式聚合某些字段,但发现AVG()存在问题: 按照这个定义: CREATE TABLE Result (CheckListId int, CheckId int, AuditId int, CheckListResult FLOAT, CheckResult FLOAT) INSERT INTO Result VALUES (1,1,1,1,1) INSERT INTO Result VALUES (1,2,1,1,3) INSERT INTO Re

我试图在同一查询中使用分区以不同的方式聚合某些字段,但发现AVG()存在问题:

按照这个定义:

CREATE TABLE Result
    (CheckListId int, CheckId int, AuditId int, CheckListResult FLOAT, CheckResult FLOAT)
INSERT INTO Result VALUES (1,1,1,1,1) 
INSERT INTO Result VALUES (1,2,1,1,3) 
INSERT INTO Result VALUES (1,2,2,3,1) 
INSERT INTO Result VALUES (2,1,1,3,1)

+-------------+---------+---------+-----------------+-------------+
| CheckListId | CheckId | AuditId | CheckListResult | CheckResult |
+-------------+---------+---------+-----------------+-------------+
|           1 |       1 |       1 |               1 |           1 |
|           1 |       2 |       1 |               1 |           3 |
|           1 |       2 |       2 |               3 |           1 |
|           2 |       1 |       1 |               3 |           1 |
+-------------+---------+---------+-----------------+-------------+
感谢您提供的格式设置

这是我的选择

 SELECT 
CheckListId
, CheckId
, (dense_rank() over (PARTITION BY CheckListId order by [AuditId]) 
+ dense_rank() over (PARTITION BY CheckListId order by [AuditId] desc) 
- 1) AS N_AuditForCheckList
, AVG(CheckListResult)  OVER(PARTITION BY CheckListId) AS AvgCheckListResult
, COUNT(AuditId) OVER (PARTITION BY CheckListId, CheckId) AS N_AuditForCheck
, AVG(CheckResult)  OVER(PARTITION BY CheckListId, CheckId) AS AvgCheckResult
FROM Result
我得到这个结果

+-------------+---------+---------------------+--------------------+-----------------+----------------+
| CheckListId | CheckId | N_AuditForCheckList | AvgCheckListResult | N_AuditForCheck | AvgCheckResult |
+-------------+---------+---------------------+--------------------+-----------------+----------------+
|           1 |       1 |                   2 | 1,67               |               1 |              1 |
|           1 |       2 |                   2 | 1,67               |               2 |              2 |
|           1 |       2 |                   2 | 1,67               |               2 |              2 |
|           2 |       1 |                   1 | 3                  |               1 |              1 |
+-------------+---------+---------------------+--------------------+-----------------+----------------+
AvgCheckListResult
中,我想要
2
,因为在这个检查表上,我有两个结果:第一次审核时1个,第二次审核时3个,而sql计算3行的平均值

有没有一种不用子查询或连接多个查询的方法

p、 美国

链接以测试它:

我(目前)还没有找到不使用子查询的方法(但我认为您已经探索了我的以下解决方案): P.S.A+1,感谢您撰写问题的方式(脚本、样本数据等)

输出:

+-------------+---------+---------+-----------------+---------------------+--------------------+---------------------+----+-----------------+----------------+---------+
| CheckListId | CheckId | AuditId | CheckListResult | N_AuditForCheckList | AvgCheckListResult | AvgCheckListResult2 | C3 | N_AuditForCheck | AvgCheckResult | AvgChk3 |
+-------------+---------+---------+-----------------+---------------------+--------------------+---------------------+----+-----------------+----------------+---------+
|           1 |       1 |       1 |               1 |                   2 |   1,66666666666667 |                   1 |  2 |               1 |              1 |       2 |
|           1 |       2 |       1 |               1 |                   2 |   1,66666666666667 |                   1 |  2 |               2 |              2 |       2 |
|           1 |       2 |       2 |               3 |                   2 |   1,66666666666667 |                   3 |  1 |               2 |              2 |       2 |
|           2 |       1 |       1 |               3 |                   1 |                  3 |                   3 |  1 |               1 |              1 |       3 |
+-------------+---------+---------+-----------------+---------------------+--------------------+---------------------+----+-----------------+----------------+---------+

也许我找到了一个嵌套查询的解决方案:

SELECT * 
    ,(SELECT AVG(T.CheckListResult)
    FROM 
     (SELECT DISTINCT AuditId, CheckListId, CheckListResult FROM Result) as T
    WHERE T.CheckListId = Base.CheckListId  
    ) AS AvgCheckListResult
    ,(SELECT COUNT(T.CheckListResult)
    FROM 
     (SELECT DISTINCT AuditId, CheckListId, CheckListResult FROM Result) as T
    WHERE T.CheckListId = Base.CheckListId  
    ) AS N_AuditForCheckList
    ,(SELECT AVG(T.CheckResult)
    FROM 
     (SELECT DISTINCT AuditId, CheckId, CheckResult FROM Result) as T
    WHERE T.CheckId = Base.CheckId  
    ) AS AvgCheckResult

FROM Result AS Base
结果是正确的,但不确定性能

SELECT * 
    ,(SELECT AVG(T.CheckListResult)
    FROM 
     (SELECT DISTINCT AuditId, CheckListId, CheckListResult FROM Result) as T
    WHERE T.CheckListId = Base.CheckListId  
    ) AS AvgCheckListResult
    ,(SELECT COUNT(T.CheckListResult)
    FROM 
     (SELECT DISTINCT AuditId, CheckListId, CheckListResult FROM Result) as T
    WHERE T.CheckListId = Base.CheckListId  
    ) AS N_AuditForCheckList
    ,(SELECT AVG(T.CheckResult)
    FROM 
     (SELECT DISTINCT AuditId, CheckId, CheckResult FROM Result) as T
    WHERE T.CheckId = Base.CheckId  
    ) AS AvgCheckResult

FROM Result AS Base