簡體   English   中英

在case sql語句中使用sum和count

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM