计数 SQL 服务器中的项目
Count items in SQL Server
这是我的数据库
我想数 Bikes
个当前在 RouteCode
中可用的同一个到期周。因此,如果 EXPIRY WEEK 不同,RouteCode
可以重新出现,否则 RouteCode
必须显示它具有的 BikeQuantity
。
这是我的问题。 RouteCode = G
出现了 2 次,每次出现 1 辆自行车,即使它们在同一周内过期。我怎么能说它在 BikeQuantity
列中有 2 辆自行车?
第一个问题是您正在 GROUP
'FoundDate'。如果您想在 per-ExpiryWeek 的基础上汇总(即求和)自行车数量,则需要按 'ExpiryWeek' 分组。
第二个问题是您正在 SELECT
ing 'FoundDate' 和 'ExpiryDate'。如果您在 'ExpiryWeek' 上分组,则不能 select 这些列,因为无法聚合这些列中的数据(日期)*。因此,您不应按 'ExpiryDate' 排序(因为此列不会出现在输出 table 中)。
( * ...因为如果您在给定的到期周有两个条目,但每个条目都有不同的 'FoundDate',您希望在结果 table 中看到什么 'FoundDate' 该行的列?)
将您的 SELECT
子句更改为:
SELECT li.RouteCode,
DATEPART(WK,DATEADD(WEEK, 4, FoundDate)) as ExpiryWeek,
COUNT(b.BikeId) As BikeQuantity
并将您的 GROUP BY
子句更改为:
GROUP BY li.RouteCode, DATEPART(WK,DATEADD(WEEK, 4, FoundDate))
ORDER BY DATEPART(WK,DATEADD(WEEK, 4, FoundDate));
您的查询应该有效。
(因为 'ExpiryWeek' 是一个计算列,您必须在 GROUP BY
和 ORDER BY
子句中提供相同的计算 - 仅指定 'ExpiryWeek' 是行不通的,至少对于 SQL 的某些变体。有一些解决方法:例如,您可以使用 'With' 子句。请参阅此答案以获取避免重复的示例:How to group by a Calculated Field)
根据您发布的最新代码,正确的查询应该是:
select li.RouteCode,
DATEPART(WK,DATEADD(WEEK, 4, b.FoundDate)) as ExpiryWeek,
COUNT(b.BikeId) as BikeQuantity
FROM dbo.Bike b
LEFT OUTER JOIN dbo.Contact ct ON b.ContactId = ct.ContactId
INNER JOIN dbo.LocationInfo li ON li.PostCode = ct.PostCode
WHERE DATEADD(day, 30, FoundDate) >= GETDATE()
Group by li.RouteCode, DATEPART(WK,DATEADD(WEEK, 4, FoundDate))
ORDER BY DATEPART(WK,DATEADD(WEEK, 4, FoundDate));
这是我的数据库
我想数 Bikes
个当前在 RouteCode
中可用的同一个到期周。因此,如果 EXPIRY WEEK 不同,RouteCode
可以重新出现,否则 RouteCode
必须显示它具有的 BikeQuantity
。
这是我的问题。 RouteCode = G
出现了 2 次,每次出现 1 辆自行车,即使它们在同一周内过期。我怎么能说它在 BikeQuantity
列中有 2 辆自行车?
第一个问题是您正在 GROUP
'FoundDate'。如果您想在 per-ExpiryWeek 的基础上汇总(即求和)自行车数量,则需要按 'ExpiryWeek' 分组。
第二个问题是您正在 SELECT
ing 'FoundDate' 和 'ExpiryDate'。如果您在 'ExpiryWeek' 上分组,则不能 select 这些列,因为无法聚合这些列中的数据(日期)*。因此,您不应按 'ExpiryDate' 排序(因为此列不会出现在输出 table 中)。
( * ...因为如果您在给定的到期周有两个条目,但每个条目都有不同的 'FoundDate',您希望在结果 table 中看到什么 'FoundDate' 该行的列?)
将您的 SELECT
子句更改为:
SELECT li.RouteCode,
DATEPART(WK,DATEADD(WEEK, 4, FoundDate)) as ExpiryWeek,
COUNT(b.BikeId) As BikeQuantity
并将您的 GROUP BY
子句更改为:
GROUP BY li.RouteCode, DATEPART(WK,DATEADD(WEEK, 4, FoundDate))
ORDER BY DATEPART(WK,DATEADD(WEEK, 4, FoundDate));
您的查询应该有效。
(因为 'ExpiryWeek' 是一个计算列,您必须在 GROUP BY
和 ORDER BY
子句中提供相同的计算 - 仅指定 'ExpiryWeek' 是行不通的,至少对于 SQL 的某些变体。有一些解决方法:例如,您可以使用 'With' 子句。请参阅此答案以获取避免重复的示例:How to group by a Calculated Field)
根据您发布的最新代码,正确的查询应该是:
select li.RouteCode,
DATEPART(WK,DATEADD(WEEK, 4, b.FoundDate)) as ExpiryWeek,
COUNT(b.BikeId) as BikeQuantity
FROM dbo.Bike b
LEFT OUTER JOIN dbo.Contact ct ON b.ContactId = ct.ContactId
INNER JOIN dbo.LocationInfo li ON li.PostCode = ct.PostCode
WHERE DATEADD(day, 30, FoundDate) >= GETDATE()
Group by li.RouteCode, DATEPART(WK,DATEADD(WEEK, 4, FoundDate))
ORDER BY DATEPART(WK,DATEADD(WEEK, 4, FoundDate));