计数 SQL 服务器中的项目

Count items in SQL Server

这是我的数据库

我想数 Bikes 个当前在 RouteCode 中可用的同一个到期周。因此,如果 EXPIRY WEEK 不同,RouteCode 可以重新出现,否则 RouteCode 必须显示它具有的 BikeQuantity

这是我的问题。 RouteCode = G 出现了 2 次,每次出现 1 辆自行车,即使它们在同一周内过期。我怎么能说它在 BikeQuantity 列中有 2 辆自行车?

第一个问题是您正在 GROUP'FoundDate'。如果您想在 per-ExpiryWeek 的基础上汇总(即求和)自行车数量,则需要按 'ExpiryWeek' 分组。

第二个问题是您正在 SELECTing '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 BYORDER 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));