我有以下SQL代码:
SELECT EmployeeID,
SUM(CASE
WHEN Error1 = '0'
THEN 1
ELSE 0
END + CASE
WHEN Error2 = '0'
THEN 1
ELSE 0
END + CASE
WHEN Error3 = '0'
THEN 1
ELSE 0
END) AS TotalErrors
FROM SubmittedDocuments
GROUP BY EmployeeID
该语句应计算每个员工表中的错误数。但是,表SubmittedDocuments中还有另一列名为“DocumentName”。我怎么能写一个只计算每个DocumentName的第一个实例的错误的语句? (或仅计算具有最低“SubmittedID”的那个,唯一标识符)
对不起,如果有任何不清楚的地方,我会尝试澄清评论中的任何混淆。
答案 0 :(得分:2)
我认为你不想聚合。我想你只想为每个名字选择第一个文件。
如果是这样,这可能是你想要的:
select sd.*,
((case when error1 = '0' then 1 else 0 end) +
(case when error2 = '0' then 1 else 0 end) +
(case when error3 = '0' then 1 else 0 end)
) as numerrors
from (select sd.*,
row_number() over (partition by documentname order by submittedid) as seqnum
from SumittedDocuments sd
) sd
where seqnum = 1;
答案 1 :(得分:2)
我可能没有从你的问题中得到这个,但我认为这应该有效。如果您可以显示一些样本数据和预期输出,那么我们肯定能得到肯定的答案。
SELECT EmployeeID
SUM(CASE WHEN DocIDErr > 1 THEN 0 ELSE 1 END)
FROM
(SELECT EmployeeID
, Error1
, ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY DocumentName) AS DocIDErr
FROM SubmittedDocuments) AS RS
GROUP BY EmployeeID