Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 CTE超过id、状态和日期导致结果一致_Sql Server 2005_Tsql_Common Table Expression - Fatal编程技术网

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))
)