计算SQL Server中的项目

时间:2016-01-09 05:24:24

标签: sql sql-server linq linq-to-sql

这是我的数据库

enter image description here

我想计算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辆自行车?

enter image description here

1 个答案:

答案 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 BYORDER 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));