这是我的数据库
我想计算Bikes
目前在同一周期RouteCode
中可用的RouteCode
。因此,如果EXPIRY WEEK不同,RouteCode
会重新出现,否则BikeQuantity
必须显示RouteCode = G
。
这是我的问题。即使在同一周内过期,BikeQuantity
也会出现2次,每次有1辆自行车。我如何说http://oldurl/dept/it/Lists/Contract Management System/DispForm.aspx?ID=4
栏中有2辆自行车?
答案 0 :(得分:0)
第一个问题是,你是GROUP
发现日期'。你需要按照“到期周刊”分组。如果你想在每个到期周期内汇总(即总和)自行车的数量。
第二个问题是你SELECT
' FoundDate'和'到期日期'。如果您要对“到期周刊”进行分组,则无法选择这些列。因为没有办法聚合那些列*中的数据(日期)。因此,您不应该通过“到期日期”来订购。 (因为此列不会出现在输出表中)。
(* ...因为如果您在给定的到期周期内有两个条目,但每个条目有不同的条款,那么您希望在'的结果表中看到什么?该行的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'子句。请参阅此答案以获取避免重复的示例:{{3 }})
根据您发布的最新代码,正确的查询应为:
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));