根据sql-server中的给定字段对COUNT进行分组

时间:2013-10-02 15:23:21

标签: sql-server count group-by

我正在尝试显示在给定时间范围内在多个位置中的每个位置进行的约会数量。我知道我可以使用GROUP BY对给定时间范围内的所有约会进行分组,例如:

SELECT AP.start_datetime, AP.Patient_Name, AP.Status, AP.Location

FROM Appointment AP 

WHERE AP.start_datetime >= '2013.09.02 00:00:00.000'
AND AP.start_datetime <= '2013.10.02 23:59:00.000'

GROUP BY AP.Location

这将返回日期范围内的所有行,并将在同一位置进行的所有约会组合在一起。

但是,我希望输出符合以下形式:

**Location** | **Appointments**
Location1    | 123
Location2    | 412
Location3    | 341
...
LocationN    | 231

我无法找到COUNT / SUMGROUP BY的正确组合来实现这一目标。我认为我的问题可能是我不完全理解GROUP BY的功能。我相信this poster提出了同样的问题,尽管他没有得到答案。

3 个答案:

答案 0 :(得分:1)

实际上,您在问题中列出的查询甚至不应该解析;你应该得到一个错误,start_datetime / parent_name / status不在GROUP BY子句中。如果按位置分组,例如,在输出中包含start_datetime的重点是什么?如果您只想为给定位置使用一行,那么应显示哪一行start_datetime?出于什么目的?尝试从这开始,获得所需的结果,如果您需要结果集中的其他列,那么更好地定义:

SELECT 
  Location, 
  Appointments = COUNT(*)
FROM dbo.Appointment
WHERE start_datetime >= '20130902'
  AND start_datetime <  '20131003'
GROUP BY Location
ORDER BY Location;

答案 1 :(得分:0)

我认为这也应该有效:

SELECT DISTINCT Location,
       COUNT(*) OVER(PARTITION BY Instrument) as Appointments
FROM Appointment
WHERE start_datetime >= '20130902'
  AND start_datetime <  '20131003'

使用此方法可以避免解析错误Aaron Bertand提到的

SELECT DISTINCT start_datetime, 
       Patient_Name, 
       Status, 
       Location,
       COUNT(*) OVER(PARTITION BY Instrument) as Appointments
FROM Appointment
WHERE start_datetime >= '20130902'
  AND start_datetime <  '20131003

会解析。它是否给出相同的结果取决于您的数据

答案 2 :(得分:0)

SELECT Location, Count(Location) AS Appointments 
FROM Appointment 
WHERE   start_datetime >= '2013.09.02 00:00:00.000'
        AND start_datetime <= '2013.10.02 23:59:00.000'
Group by Location
ORDER BY Location