【问题标题】:Need monthly report where I need summation of Qty for each day需要每月报告,我需要每天的数量总和
【发布时间】:2017-05-04 05:45:01
【问题描述】:

我有一个表 STOCK_REGISTER,其中有 Id、ItmId、Qty、CreatedDate 列。并且有每日的交易数据,比如项目向内、向外和所有。

现在我正在开发一份月度报告,我想在其中显示整个月项目数量的按日汇总。为此,我编写了以下查询。

SELECT CONVERT(Date,CreatedDate) AS CreatedDate,ItmId, SUM(Qty)
FROM   STOCK_REGISTER
GROUP BY CONVERT(Date,CreatedDate),ItmId

此查询返回正确的数据,但如果我要的是 2017 年 4 月的数据并且 STOCK_REGISTER 在 4 月 5 日没有任何记录,那么它根本不会显示 4 月 5 日,我需要 0 值在 4 月 5 日该项目的数量.

您能帮我获取此类数据吗?

编辑:

我创建了一个查询,它给出了任何特定月份的所有天数,并使用 STOCK_REGISTER 应用了左联接,但仍未解决我的问题。

declare @month int, @year int

set @month = 4

set @year = 2017

SELECT  CAST(CAST(@year AS VARCHAR) + '-' + CAST(@Month AS VARCHAR) + '-01' AS DATETIME) + A.Number AS STKFG_CREATED_DATE,
        B.STKFG_ITM_ID,
        0 AS OPENING_STOCK,
        SUM(STKFG_QTY)
FROM    master..spt_values A
        LEFT JOIN STOCK_REGISTER_FG B
ON          CONVERT(DATE,CAST(CAST(@year AS VARCHAR) + '-' + CAST(@Month AS VARCHAR) + '-01' AS DATETIME) + A.Number) = CONVERT(DATE,B.STKFG_CREATED_DATE)
        AND C.ITM_ID = B.STKFG_ITM_ID
WHERE type = 'P'
    AND (CAST(CAST(@year AS VARCHAR) + '-' + CAST(@Month AS VARCHAR) + '-01' AS DATETIME) + A.Number ) <
        DATEADD(mm,1,CAST(CAST(@year AS VARCHAR) + '-' + CAST(@Month AS VARCHAR) + '-01' AS DATETIME) )
    AND STKFG_TRAT_ID = 6
GROUP BY A.Number, B.STKFG_ITM_ID
ORDER BY B.STKFG_ITM_ID,CAST(CAST(@year AS VARCHAR) + '-' + CAST(@Month AS VARCHAR) + '-01' AS DATETIME) + A.Number

【问题讨论】:

  • 你可以有一个通用的日历表,并通过左连接将该表用作日期的源。
  • 如果某些日期根本不存在于您的数据集中,那么您需要以某种方式将它们引入。日历表是一种选择。
  • 您需要这些数据的日期范围是多少?
  • 2 种方式:1-无论是在STOCK_REGISTER 表中插入数据,计划这样的方式,如果没有发生导出导入,那么它也会在当天结束时插入当前日期的数据.2-创建一个带有全年日期(SELECT to_date('01/01/2014', 'dd/mm/yyyy') + rownum - 1 AS all_date FROM dual CONNECT BY LEVEL &lt;= 365;) 的表格,并与您的表格进行左连接。
  • @BennjoeMordeno 我已经使用了这个逻辑。我已经从查询中获得了所有天数,并且已经对我的表应用了左联接,但我仍然没有得到日期不存在的记录

标签: sql sql-server


【解决方案1】:

感谢您的 cmets。

我找到了一种适合我的解决方案。

此处#TEMP_TABLE 包含所有日期。

SELECT  A.CREATED_DATE,B.ITM_NAME,ISNULL(C.STKFG_QTY,0)
FROM    #TEMP_TABLE A
        CROSS APPLY ITEM_MASTER B
        LEFT JOIN ( SELECT  CONVERT(DATE,STKFG_CREATED_DATE) AS STKFG_CREATED_DATE, STKFG_ITM_ID, SUM(STKFG_QTY) AS STKFG_QTY
                    FROM    STOCK_REGISTER_FG GROUP BY CONVERT(DATE,STKFG_CREATED_DATE),STKFG_ITM_ID) C
ON          CONVERT(DATE,A.CREATED_DATE) = CONVERT(DATE,C.STKFG_CREATED_DATE)
            AND B.ITM_ID = C.STKFG_ITM_ID
ORDER BY B.ITM_NAME,A.CREATED_DATE

【讨论】:

    【解决方案2】:

    试试下面的脚本。这里@tblData 是您的实际表名。

         declare @tblData table
    
    (id int,datecolumn date)
    INSERT INTO @tblData
            (id,datecolumn)
    
     SELECT 1,'2010-01-01' UNION ALL  
     SELECT 3,'2010-01-01' UNION ALL  
     SELECT 1,'2010-01-03' UNION ALL  
     SELECT 2,'2010-01-04' UNION ALL      
     SELECT 1,'2010-01-05' UNION ALL  
     SELECT 3,'2010-01-06' UNION ALL  
     SELECT 1,'2010-01-10' UNION ALL  
     SELECT 1,'2010-01-10' UNION ALL  
     SELECT 2,'2010-01-11' UNION ALL  
     SELECT 1,'2010-01-11' UNION ALL  
     SELECT 2,'2010-01-11' UNION ALL   
     SELECT 1,'2010-01-12'  UNION ALL          
     SELECT 3,'2010-01-13' 
    
    
    
    DECLARE  @MaxDate DATE, 
             @MinDate DATE, 
             @iDate  DATE 
    
    DECLARE  @DateSequence TABLE( 
                              DATE1 DATE 
                              ) 
    
    SELECT @MaxDate = Convert(DATE,Max(datecolumn)), 
           @MinDate = Convert(DATE,Min(datecolumn)) 
    FROM   @tblData -- Put your month condition 
    
    SET @iDate = @MinDate 
    
    WHILE (@iDate <= @MaxDate) 
      BEGIN 
        INSERT @DateSequence
        SELECT @iDate 
    
        SET @iDate = Convert(DATE,Dateadd(DAY,1,@iDate)) 
      END 
    
    SELECT  a.DATE1 ,isnull(sum(b.id),0) as total
    FROM   @DateSequence a left join @tblData b on a.DATE1=b.datecolumn
    group by a.DATE1
    

    谢谢,

    【讨论】:

    • 您好,此解决方案不适用于我的情况,因为我在@tblData 中还有一个字段,即 ItmId,我也希望按 ItmId 分组。实际上我在 Item_Master 中有 400 个项目,我想要的是所有 400 个项目,每月 30 天意味着它应该是 12000 条记录,无论数量是零还是其他。
    • 然后在 select 和 group by 中添加 item id
    • 我已经尝试过了,这样做不会提供所有日期的详细信息。
    • SELECT CONVERT(DATE,A.CREATED_DATE),SUM(STKFG_QTY),B.STKFG_ITM_ID FROM #TEMP_TABLE A LEFT JOIN STOCK_REGISTER_FG B ON CONVERT(DATE,A.CREATED_DATE) = CONVERT(DATE,B. STKFG_CREATED_DATE) GROUP BY CONVERT(DATE,A.CREATED_DATE),B.STKFG_ITM_ID 我在#TEMP_TABLE 中有 2017 年 4 月 1 日至 2017 年 4 月 30 日
    • 根据您的脚本,我猜它不会返回您的预期结果但例如让日期为 2010-01-01 项目编号。 100 被售出两次,数量为 1 和 3,那么它应该返回结果如下 2010-01-01(日期)100(项目编号)4(作为总数量)对吗?并且对于日期 2010-01-02,没有商品售出,然后输出就像 2010-01-02(日期)0(商品编号)0(作为总数量)。这是您的要求还是有些不同,请分享一些输出格式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多