[英]using sum and count inside case sql statement
我想對表中的每一行進行計數,但是我收到此錯誤:
無法對包含聚合或子查詢的表達式執行聚合函數。
SELECT TOP (100) PERCENT ISNULL(MAX(Id), 0) AS ID,
MONTH(p.datep) AS nMonth,
DATENAME(mm, p.dateP) AS month,
YEAR(p.dateP) AS year, c.EId, e.SId,
e.nE, s.libelle,
SUM(p.a) AS a,
SUM(p.a - p.b) AS c,
SUM(p.b) AS b,
SUM(p.dureePM + p.dureeAM) AS dX,
SUM(CASE WHEN p.dureePm != 0 THEN 1 ELSE 0 END) AS nbrPm,
SUM(CASE WHEN p.dureeAm != 0 THEN 1 ELSE 0 END) AS nbrAm,
COUNT(CASE WHEN p.nbX > 2 THEN SUM(p.nbX-2) ELSE 0 END) AS nbrXSupp,
COUNT(CASE WHEN p.nbY > 2 THEN SUM(p.nbY-2) ELSE 0 END) AS nbrYSupp
FROM dbo.table AS p
INNER JOIN
dbo.tableC AS c ON p.cId = c.CId
INNER JOIN
dbo.tableE AS e ON c.EId = e.EId
INNER JOIN
dbo.tableS AS s ON e.SId = s.SId
GROUP BY MONTH(p.dateP), DATENAME(mm, p.dateP), YEAR(p.dateP),
c.EId, e.SId, e.nE, s.libelle
最簡單的方法是使用CTE。 希望這有幫助
CREATE TABLE ## tableA(id INT,x INT,y INT)INSERT INTO ## tableA VALUES(1,5,3),(2,7,2),(3,2,5)
; WITH SUMS AS(SELECT id,
情況x> 2 THEN(x-2)ELSE 0 END作為number1,情況y> 2 THEN(y-2)ELSE 0 END AS number2
來自## tableA)
SELECT * FROM SUMS
Select SUM(T1Count.TotalRec) T1Counts, SUM(T2Count.TotalRec) T2Counts
From Table1 T01
Outer Apply (Select COUNT(T01_Id) TotalRec From Table1 T1 Where T1.T01_Id=T01.T01_Id And T01_FieldToCheck > 1) T1Count
Outer Apply (Select COUNT(T01_Id) TotalRec From Table1 T1 Where T1.T01_Id=T01.T01_Id And T01_FieldToCheck =< 1) T2Count
我認為這可以幫助你解決一些問題。 這樣,您可以對數據進行不同的條件摘要。
如果有任何問題,請回來。
下面的查詢將給出所需的輸出: -
SELECT id,
CASE WHEN min(x)> 2 THEN (min(x)-2) ELSE 0 END AS number1,
CASE WHEN min(y) > 2 THEN (min(y)-2) ELSE 0 END AS number2
FROM tableA
group by id
輸出: -
id number1 number2
1 3 1
2 5 0
3 0 3
正如我在評論中已經提到的,SQl服務器不支持另一個內部的聚合函數。 您可以通過兩個步驟打破查詢來實現目的。 我已將您的查詢保存在cte中,並進一步查詢它以計算您需要的列。
with cte as
(
SELECT TOP (100) PERCENT ISNULL(MAX(Id), 0) AS ID,
MONTH(p.datep) AS nMonth,
DATENAME(mm, p.dateP) AS month,
YEAR(p.dateP) AS year, c.EId, e.SId,
e.nE, s.libelle,
SUM(p.a) AS a,
SUM(p.a - p.b) AS c,
SUM(p.b) AS b,
SUM(p.dureePM + p.dureeAM) AS dX,
SUM(CASE WHEN p.dureePm != 0 THEN 1 ELSE 0 END) AS nbrPm,
SUM(CASE WHEN p.dureeAm != 0 THEN 1 ELSE 0 END) AS nbrAm,
CASE WHEN p.nbX > 2 THEN SUM(p.nbX-2) ELSE 0 END AS nbrXSupp, --removed the COUNT
CASE WHEN p.nbY > 2 THEN SUM(p.nbY-2) ELSE 0 END AS nbrYSupp
FROM dbo.table AS p
INNER JOIN
dbo.tableC AS c ON p.cId = c.CId
INNER JOIN
dbo.tableE AS e ON c.EId = e.EId
INNER JOIN
dbo.tableS AS s ON e.SId = s.SId
GROUP BY MONTH(p.dateP), DATENAME(mm, p.dateP), YEAR(p.dateP),
c.EId, e.SId, e.nE, s.libelle
)
select cte.*,count(nbrXSupp) as Cn_nbrXSupp,count(nbrYSupp) as Cn_nbrYSupp
from cte
group by nMonth,month,year,EId,SId, nE,libelle
希望能幫助到你。 顯然我沒有運行並測試它。如果查詢中有任何列綁定問題,請將它們排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.