Sql server 汇总销售日志表中每小时销售数量的T-SQL查询

Sql server 汇总销售日志表中每小时销售数量的T-SQL查询,sql-server,tsql,Sql Server,Tsql,我有一个销售表,用于捕获商品的销售额。简化销售表包含以下列: [InsertedDateTime] [datetime] NOT NULL, [ItemCode] [bigint] NOT NULL, [Qty] [float] NULL 我需要一个T-SQL查询,根据InsertedDateTime返回每天每小时内每个ItemCode的总数量: , 我可以只通过一个查询完成这项工作,还是需要先将数据处理到“摘要”表中?使用Group by和Sum 使用CTE获取每小时的详细信息 ;With

我有一个销售表,用于捕获商品的销售额。简化销售表包含以下列:

[InsertedDateTime] [datetime] NOT NULL,
[ItemCode] [bigint] NOT NULL,
[Qty] [float] NULL
我需要一个T-SQL查询,根据InsertedDateTime返回每天每小时内每个ItemCode的总数量:

,

我可以只通过一个查询完成这项工作,还是需要先将数据处理到“摘要”表中?

使用Group by和Sum

使用CTE获取每小时的详细信息

;With CTE AS
(
SELECT 1 AS Cnt
UNION ALL
SELECT Cnt + 1 FROm CTE WHERE cnt + 1 <= 24
)

SELECT A.cnt AS [Hour], B.[ItemCode],
       B.[InsertedDateTime],
       B.Hourly_Total FROM CTE AS A
Left join
(
SELECT [ItemCode],
       [InsertedDateTime],
       Datepart(hour, [InsertedDateTime]) AS [hour],
       Sum(qty) Hourly_Total
FROM   yourtable
GROUP  BY [ItemCode],
          [InsertedDateTime],
          Datepart(hour, [InsertedDateTime]) 

) AS B
ON A.Cnt = [B.hour]

此存储过程传递的字符串类似于日期“2014-2-2”

CREATE PROCEDURE [dbo].[GetQuanitySoldByHours]
 (
      @Date datetime
 )

AS 

BEGIN
Create Table #DayHours  -- A Primary Table just To make the left join
(
   hour bigint
)

Declare @Counter int = 0;

WHILE @Counter <= 23    -- Adding values to temp table in loop
BEGIN    
    INSERT INTO #DayHours VALUES (@Counter)
    SET @Counter = @Counter + 1;
END



SELECT
    @Date AS DAYDATE
    dh.hour AS DAYHOUR ,
    ISNULL(s.ItemCode,0) AS ITEMCODE,
    ISNULL(SUM(s.Qty),0) AS SOLDQUATITY 
FROM #DayHours dH 
left outer join 
dbo.Sales s 
ON dh.hour = DATEPART(hh,s.InsertedDateTime) 
GROUP BY s.ItemCode, dh.hour

DROP TABLE #DayHours   -- Droping temp table 

END

这是我需要的输出:YYYYMMDD,HH,ItemCode,该项目代码在HH小时内的总数量只要OP在没有产品销售的小时内不需要行,这是绝对正确的all@paul-如果OP需要将丢失的小时数总计为0,则使用日历或小时表与该表进行左连接,但实际上仅24行不存在问题,但是,使用递归CTE生成数字序列根本不能很好地扩展,最好避免。Aaron Bertrand做了一件值得一读的好事。使用WHILE循环生成一个包含24个数字的表是@GarethD,如果我在临时表中使用一个标识列并只调用insert 24次会更快吗。另外,我读过这篇文章,它是优化生成序列的方式吗?你能推荐什么更好、最优化的方法吗?老实说,对于24行来说,这两种方法都不会有太大区别,我更喜欢使用堆叠CTE方法,但正如你在接近底部看到的,使用数字表、堆叠CTE或某个系统表之间的区别并不显著,因此,这确实是个人的偏好-只是不是递归CTE或while循环。对于像一天24小时这样小而静态的东西,我可能只会从值0、1、2、3、4…23 t[Hour]中使用-SELECT[Hour]。
CREATE TABLE [dbo].[Sales](
[InsertedDateTime] [datetime] NOT NULL,
[ItemCode] [bigint] NOT NULL,
[Qty] [float] NULL
CREATE PROCEDURE [dbo].[GetQuanitySoldByHours]
 (
      @Date datetime
 )

AS 

BEGIN
Create Table #DayHours  -- A Primary Table just To make the left join
(
   hour bigint
)

Declare @Counter int = 0;

WHILE @Counter <= 23    -- Adding values to temp table in loop
BEGIN    
    INSERT INTO #DayHours VALUES (@Counter)
    SET @Counter = @Counter + 1;
END



SELECT
    @Date AS DAYDATE
    dh.hour AS DAYHOUR ,
    ISNULL(s.ItemCode,0) AS ITEMCODE,
    ISNULL(SUM(s.Qty),0) AS SOLDQUATITY 
FROM #DayHours dH 
left outer join 
dbo.Sales s 
ON dh.hour = DATEPART(hh,s.InsertedDateTime) 
GROUP BY s.ItemCode, dh.hour

DROP TABLE #DayHours   -- Droping temp table 

END