Sql server 2005 CTE超过id、状态和日期导致结果一致
我有一个表定义为Sql server 2005 CTE超过id、状态和日期导致结果一致,sql-server-2005,tsql,common-table-expression,Sql Server 2005,Tsql,Common Table Expression,我有一个表定义为 CREATE TABLE ItemDetail ( ItemNumber bigint not null, SiteId int not null, Status int not null, ScanDate datetime not null, ) 我要做的是按站点、状态和日期获取计数。我有一个定义的CTE ;WITH statCTE AS ( SELECT
CREATE TABLE ItemDetail (
ItemNumber bigint not null,
SiteId int not null,
Status int not null,
ScanDate datetime not null,
)
我要做的是按站点、状态和日期获取计数。我有一个定义的CTE
;WITH statCTE AS (
SELECT
Count(ItemNumber) over(partition by SiteId, Status, DATEADD(dd, 0, DATEDIFF(dd, 0, ScanDate))) as ItemCount,
SiteId,
Status,
DATEADD(dd, 0, DATEDIFF(dd, 0, ScanDate)) AS ScanDate
FROM
ItemDetail
)
问题是当我跑的时候
select * from statCTE where siteid = 119 and scandate = '3/3/2011'
我明白了
结果集应该是两行,一行2表示状态0,另一行6表示状态6。因此,我的分区没有将日期转换为一个日期对象并拾取结果。我可以在最后的查询(透视图)中将
ItemCount
总数平方根,但这与其说是解决实际问题,不如说是一种黑客行为。您误解了窗口函数(或排名函数)的使用。在您的情况下,计数不是一个聚合。此用法将函数的结果添加到查询返回的每一行。通常,聚合在select子句之前处理,但在本例中,聚合是沿着select子句处理的。因此,TSQL计算满足分区的行数,并沿查询返回的每一行输出它
您有两个分区,其计数分别为2和6(由窗口分区函数计算),然后整个结果集将附加一列
如果需要2和6结果,则需要使用GROUPBY子句编写查询
WITH statCTE AS (
SELECT
Count(ItemNumber)as ItemCount,
SiteId,
Status,
DATEADD(dd, 0, DATEDIFF(dd, 0, ScanDate)) AS ScanDate
FROM
ItemDetail
group by SiteId, Status, DATEADD(dd, 0, DATEDIFF(dd, 0, ScanDate))
)
您的CTE在ItemDetail中每行仍将有一行。请参见上的示例B。
WITH statCTE AS (
SELECT
Count(ItemNumber)as ItemCount,
SiteId,
Status,
DATEADD(dd, 0, DATEDIFF(dd, 0, ScanDate)) AS ScanDate
FROM
ItemDetail
group by SiteId, Status, DATEADD(dd, 0, DATEDIFF(dd, 0, ScanDate))
)