0

我正在尝试显示在给定时间范围内在几个位置中的每个位置进行的约会数量。我知道我可以使用 对在给定时间范围内进行的所有约会进行分组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运作。我相信这张海报提出了同样的问题,尽管他没有得到答案。

4

3 回答 3

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;
于 2013-10-02T15:28:09.257 回答
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
于 2013-10-02T15:37:16.947 回答
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

will parse. Whether it gives the same result though depends on your data

于 2013-10-02T15:35:49.087 回答