在SQL Server 2005中按小时,日,月创建订单计数摘要的最有效方法是什么?

The*_*edi 3 sql sql-server sql-server-2005 report

给出一张表:

create table #orders (
    orderid int,
    orderdatetime datetime
)
Run Code Online (Sandbox Code Playgroud)

编写sql以输出包含当前和之前24小时的订单数量,当前和前7天的总订单,当前周和前4周的总订单以及总订单的报告的最佳方法是什么?本月和前6个月?

我想知道是否可以使用分析函数有效地将其汇总到单个sql中,或者如果生成4组数据的4个sql语句是唯一(或最佳)方式.

另外,考虑到每小时/每天/每周分组,如何在sql server中执行此操作?每当我不得不与他们做这样的事情时,日期时间似乎是屁股的痛苦......

想法?放入SSAS立方体并从那里做到吗?

Qua*_*noi 6

SELECT  DATEPART(month, orderdatetime), DATEPART(week, orderdatetime), DATEPART(day, orderdatetime), COUNT(*)
FROM    #orders
GROUP BY
        DATEPART(month, orderdatetime), DATEPART(week, orderdatetime), DATEPART(day, orderdatetime) WITH ROLLUP
Run Code Online (Sandbox Code Playgroud)

这将COUNT在一个查询中按天,周和月分组.

本周汇总将有一个NULLDATEPART(day, orderdatetime)列,当月汇总将有NULL两个DATEPART(day, orderdatetime)DATEPART(week, orderdatetime)列.

要从当前没有间隙的每小时,每天,每周或每月制作它,请使用CTE:

WITH    q_hours AS
        (
        SELECT  0 AS col_hour
        UNION ALL
        SELECT  col_hour + 1
        FROM    q_hours
        WHERE   col_hour < 22
        ),
        q_days AS
        (
        SELECT  0 AS col_day
        UNION ALL
        SELECT  col_day + 1
        FROM    q_days
        WHERE   col_day < 31
        ),
        q_months AS
        (
        SELECT  0 AS col_month
        UNION ALL
        SELECT  col_month + 1
        FROM    q_months
        WHERE   col_month < 12
        )
SELECT  col_month, col_day, col_hour, COUNT(orderid)
FROM    q_hours
CROSS JOIN
        q_days
CROSS JOIN
        q_months
LEFT JOIN
        #orders
ON      DATEDIFF(month, orderdatetime, GETDATE()) = col_month
        AND DATEDIFF(day, orderdatetime, GETDATE()) % 31 = col_day
        AND DATEDIFF(hour, orderdatetime, GETDATE()) % 24 = col_hour
GROUP BY
        col_month, col_day, col_hour WITH ROLLUP
HAVING  (
        col_month = 0
        AND col_day = 0
        AND col_hour IS NOT NULL
        ) -- all hours within 24 hours from now
        OR
        (
        col_month = 0
        AND col_day <= 7
        AND col_hour IS NULL
        ) -- all days within 7 days from now
        OR
        (
        col_month <= 6
        AND col_day IS NULL
        AND col_hour IS NULL
        ) -- all months within 6 months from now
Run Code Online (Sandbox Code Playgroud)