简体   繁体   English

在case sql语句中使用sum和count

[英]using sum and count inside case sql statement

I want to do count for each row from table but I get this error: 我想对表中的每一行进行计数,但是我收到此错误:

Can not perform an aggregate function on an expression containing an aggregate or a subquery. 无法对包含聚合或子查询的表达式执行聚合函数。

   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

The easiest way is to use a CTE. 最简单的方法是使用CTE。 Hope this help 希望这有帮助

CREATE TABLE ##tableA (id INT, x INT, y INT) INSERT INTO ##tableA VALUES (1, 5, 3), (2, 7, 2), (3, 2, 5) 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, ; WITH SUMS AS(SELECT id,
CASE WHEN x> 2 THEN (x-2) ELSE 0 END AS number1, CASE WHEN y > 2 THEN (y-2) ELSE 0 END AS number2 情况x> 2 THEN(x-2)ELSE 0 END作为number1,情况y> 2 THEN(y-2)ELSE 0 END AS number2

FROM ##tableA ) 来自## tableA)

SELECT * FROM SUMS 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

I think this would help you a little to sort out your problem. 我认为这可以帮助你解决一些问题。 This way you can have different conditional summary on your data. 这样,您可以对数据进行不同的条件摘要。

get back if any problem in the same. 如果有任何问题,请回来。

Below query will give the required output :- 下面的查询将给出所需的输出: -

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

Output :- 输出: -

id  number1 number2
 1     3    1
 2     5    0
 3     0    3

As already mentioned in my comment, SQl server doesn't support aggregate function inside another. 正如我在评论中已经提到的,SQl服务器不支持另一个内部的聚合函数。 you can achieve you purpose by breaking your query in two steps. 您可以通过两个步骤打破查询来实现目的。 I have kept your query in a cte and further queried it to get count on the columns you needed. 我已将您的查询保存在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

Hope it helps. 希望能帮助到你。 Obviously I haven't run and tested it.If there are any column binding issues in the query, please sort them out. 显然我没有运行并测试它。如果查询中有任何列绑定问题,请将它们排序。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM