1

相当新的SQL。我正在尝试计算有时在两个地区的假期查询中的预订 ID 总数。

这是我需要的..

ID        count  Region name
427139        1  France
427776        2  Spain
427776        2  France

但似乎只提供这个..

ID        count  Region name
427139        1  France
427776        1  Spain
427776        1  France 

Bookings ID 是唯一的,但是当我从我的 Region 表中引入 Region 时(通过 Quotes 和 Properties 表),它被分成 2 行。

这是我的 SQL ..

SELECT count(BO.ID) as Count,
       BO.ID AS 'Booking ID',
       RE.Name AS 'Region name'
FROM Booking BO WITH (NOLOCK)
  LEFT JOIN Quote QU WITH (NOLOCK) ON QU.ID = BO.QuoteID 
  LEFT JOIN Property PR WITH (NOLOCK) ON PR.Code = QU.Code 
  LEFT JOIN Region RE WITH (NOLOCK) ON RE.ID = PR.RegionID 
WHERE BO.ID = '427776' OR BO.ID = '427139'
Group by BO.ID,RE.Name 
ORDER BY BO.ID

任何人都可以帮忙吗?

感谢您的关注!

4

2 回答 2

0

尝试阅读 SQL 中的聚合函数(这是我能找到的最佳链接):

http://www.w3resource.com/sql/group-by.php

GROUP BY 将您的结果分组,然后在每个组上调用聚合函数。由于您是按 ID 和地区分组的,因此您将获得该 ID 和地区的计数 - 而不仅仅是该 ID 的计数。

因此,只需选择要计算哪个组即可。

于 2013-07-31T14:59:33.480 回答
0

在 SQLServer2005+ 中,您可以将 OVER() 子句与聚合函数 COUNT() 一起使用

SELECT COUNT(*) OVER(PARTITION BY BO.ID) as [Count],
       BO.ID AS 'Booking ID',
       RE.Name AS 'Region name' 
FROM Booking BO WITH (NOLOCK)
  LEFT JOIN Quote QU WITH (NOLOCK) ON QU.ID = BO.QuoteID 
  LEFT JOIN Property PR WITH (NOLOCK) ON PR.Code = QU.Code 
  LEFT JOIN Region RE WITH (NOLOCK) ON RE.ID = PR.RegionID
WHERE BO.ID = '427776' OR BO.ID = '427139'
GROUP BY BO.ID, RE.Name
ORDER BY BO.ID

我认为新格式的请求可以在没有 GROUP BY 子句的情况下使用

SELECT COUNT(*) OVER(PARTITION BY BO.ID) as [Count],
       BO.ID AS 'Booking ID',
       RE.Name AS 'Region name' 
FROM Booking BO WITH (NOLOCK)
  LEFT JOIN Quote QU WITH (NOLOCK) ON QU.ID = BO.QuoteID 
  LEFT JOIN Property PR WITH (NOLOCK) ON PR.Code = QU.Code 
  LEFT JOIN Region RE WITH (NOLOCK) ON RE.ID = PR.RegionID
WHERE BO.ID = '427776' OR BO.ID = '427139'
ORDER BY BO.ID
于 2013-07-31T14:47:41.037 回答