SQL-平均值和计数的分组段

SQL-平均值和计数的分组段,sql,sql-server,Sql,Sql Server,对于停车场引文数据库,我编写了以下语法,以显示属于特定ViolFine参数的每个引文的一段: SELECT Citation, Make, ViolCode, ViolDate, ViolFine ,CASE WHEN ViolFine BETWEEN 0.00 AND 50.00 THEN '01. $0.00 - $50.00' WHEN ViolFine BETWEEN 50.01 AND 100.00 THEN '02. $50.01 - $10

对于停车场引文数据库,我编写了以下语法,以显示属于特定ViolFine参数的每个引文的一段:

SELECT Citation, Make, ViolCode, ViolDate, ViolFine
    ,CASE 
        WHEN ViolFine BETWEEN 0.00 AND 50.00 THEN '01. $0.00 - $50.00'
        WHEN ViolFine BETWEEN 50.01 AND 100.00 THEN '02. $50.01 - $100.00'
        WHEN ViolFine > 100 THEN '03. larger than $100.00'  
      END AS ViolFineSegments
FROM dbo.ParkingCitations
ORDER BY ViolDate DESC
现在,我想得到将上面定义的每个段分组的结果。我使用了下面的方法,但它似乎是将每个不同的小提琴与其相应的引用总数以及分段参数进行分组:

SELECT AVG(ViolFine) AS AvgFine, COUNT(Citation) AS NumberViolations
    ,CASE 
        WHEN AVG(ViolFine) BETWEEN 0.00 AND 50.00 THEN '01. $0.00 - $50.00'
        WHEN AVG(ViolFine) BETWEEN 50.01 AND 100.00 THEN '02. $50.01 - $100.00'
        WHEN AVG(ViolFine) > 100 THEN '03. larger than $100.00' 
      END AS ViolFineSegments
FROM dbo.ParkingCitations
GROUP BY  ViolFine
ORDER BY ViolFine
基本上,我只希望每个组段有三行,显示每个组的平均引用和计数,我确定如何继续

我也尝试了下面的方法,但那只是列出了一个长的行,我希望有三个单独的行

SELECT COUNT(CASE WHEN ViolFine BETWEEN 0.00 AND 50.00 THEN '01. $0.00 - $50.00' END) '0-50',
       COUNT(CASE WHEN ViolFine BETWEEN 50.01 AND 100.00 THEN '02. $50.01 - $100.00' END) as '50-100',
       COUNT(CASE WHEN ViolFine > 100 THEN '03. larger than $100.00' END) as '>100',
       AVG(CASE WHEN ViolFine BETWEEN 0.00 AND 50.00 THEN ViolFine END) as '0-50',
       AVG(CASE WHEN ViolFine BETWEEN 50.01 AND 100.00 THEN ViolFine END) as '50-100',
       AVG(CASE WHEN ViolFine > 100 THEN ViolFine END) as '>100'
FROM dbo.ParkingCitations;

使用
case
表达式分段,并根据该表达式分组以获得平均值和计数

SELECT 
CASE WHEN ViolFine BETWEEN 0.00 AND 50.00 THEN '01. $0.00 - $50.00'         
     WHEN ViolFine BETWEEN 50.01 AND 100.00 THEN '02. $50.01 - $100.00' 
     WHEN ViolFine > 100 THEN '03. larger than $100.00' 
END as fine_segment
,COUNT(*) as fine_count
,AVG(1.0*ViolFine) as avg_fine
FROM dbo.ParkingCitations
GROUP BY CASE WHEN ViolFine BETWEEN 0.00 AND 50.00 THEN '01. $0.00 - $50.00'         
              WHEN ViolFine BETWEEN 50.01 AND 100.00 THEN '02. $50.01 - $100.00' 
              WHEN ViolFine > 100 THEN '03. larger than $100.00' 
         END

使用
case
表达式分段,并根据该表达式分组以获得平均值和计数

SELECT 
CASE WHEN ViolFine BETWEEN 0.00 AND 50.00 THEN '01. $0.00 - $50.00'         
     WHEN ViolFine BETWEEN 50.01 AND 100.00 THEN '02. $50.01 - $100.00' 
     WHEN ViolFine > 100 THEN '03. larger than $100.00' 
END as fine_segment
,COUNT(*) as fine_count
,AVG(1.0*ViolFine) as avg_fine
FROM dbo.ParkingCitations
GROUP BY CASE WHEN ViolFine BETWEEN 0.00 AND 50.00 THEN '01. $0.00 - $50.00'         
              WHEN ViolFine BETWEEN 50.01 AND 100.00 THEN '02. $50.01 - $100.00' 
              WHEN ViolFine > 100 THEN '03. larger than $100.00' 
         END

我面前没有一个编辑器,但您可以对所有案例语句使用UNIONALL

    SELECT AVG(ViolFine) AS AvgFine, COUNT(Citation) AS NumberViolations, AVG(ViolFine) AS [01. $0.00 - $50.00]
    FROM dbo.ParkingCitations
    GROUP BY  ViolFine
    HAVING AVG(ViolFine) BETWEEN 0.00 AND 50.00
    UNION ALL
    SELECT AVG(ViolFine) AS AvgFine, COUNT(Citation) AS NumberViolations, AVG(ViolFine) AS [02. $50.01 - $100.00]    
    ...

我面前没有一个编辑器,但您可以对所有案例语句使用UNIONALL

    SELECT AVG(ViolFine) AS AvgFine, COUNT(Citation) AS NumberViolations, AVG(ViolFine) AS [01. $0.00 - $50.00]
    FROM dbo.ParkingCitations
    GROUP BY  ViolFine
    HAVING AVG(ViolFine) BETWEEN 0.00 AND 50.00
    UNION ALL
    SELECT AVG(ViolFine) AS AvgFine, COUNT(Citation) AS NumberViolations, AVG(ViolFine) AS [02. $50.01 - $100.00]    
    ...

谢谢,这有帮助,我不确定是否使用GROUPBY和WHEN子句。谢谢,这有帮助,我不确定是否使用GROUPBY和WHEN子句。