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立方体并从那里做到吗?
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在一个查询中按天,周和月分组.
本周汇总将有一个NULL在DATEPART(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)
| 归档时间: |
|
| 查看次数: |
870 次 |
| 最近记录: |