如何用上个月的值替换“无”单元格

Posted

技术标签:

【中文标题】如何用上个月的值替换“无”单元格【英文标题】:how to replace "Nothing" cell by last month value 【发布时间】:2014-03-31 08:54:48 【问题描述】:

我正在使用 s-s-rS 通过 Matrix 开发报告。

我每个月对产品销售数量求和,但如果某个月的销售数量为 0,则单元格将为 Nothing

我正在尝试使用Previous 函数来解决问题,但此函数似乎不适用于 Matrix 对象。

有什么办法吗?

第一个表是当前报告结果。 第二张桌子是我想要的。

【问题讨论】:

我认为更改您用作数据集源的 SQL 查询或存储过程以使其返回矩阵所需的目标数据是有意义的。如果您共享您使用的 SQL 语句,那么有人可以帮助您调整它。 codeselect x.date2 'yyyy/mm' , x.product_name , x.Month_sale_QTY from (select Dateadd(d,1-DATEPART(d,a.date),a.date) AS Date2 , a.product_name , sum(a.sale_qty) as Month_sale_QTY from a group by Dateadd(d,1-DATEPART(d,a.date),a.date) , a.product_name) as x group by x.date2 , x.product_name, x.Month_sale_QTY order by x.Product_name, x.Date2 【参考方案1】:

假设您有一个结构和内容如下的表格:

CREATE TABLE a (date Date, product_name NVarchar(20), sale_qty Decimal(10,2))
INSERT INTO a (date, product_name, sale_qty) VALUES ('20130510','product A',1)
INSERT INTO a (date, product_name, sale_qty) VALUES ('20130601','product A',0)
INSERT INTO a (date, product_name, sale_qty) VALUES ('20130501','product B',5)
INSERT INTO a (date, product_name, sale_qty) VALUES ('20140205','product A',1)
INSERT INTO a (date, product_name, sale_qty) VALUES ('20140215','product A',1)
INSERT INTO a (date, product_name, sale_qty) VALUES ('20140202','product B',2)
INSERT INTO a (date, product_name, sale_qty) VALUES ('20140301','product A',0)

那么下面的 sql-statement 将为你工作(据我了解的要求):

SELECT
      y.Date2 AS 'yyyy/mm'
    , y.product_name
    , ISNULL(z.Month_sale_QTY,0) AS Month_sale_QTY

FROM
    (SELECT
          DATEADD(MONTH, x.number, y.StartDate) AS Date2
        , (SELECT TOP 1 DATEADD(d,1-DATEPART(d,a.date),a.date) FROM a WHERE DATEADD(d,1-DATEPART(d,a.date),a.date) <= DATEADD(MONTH, x.number, y.StartDate) AND a.product_name = p.product_name AND ISNULL(a.sale_qty,0)<>0 ORDER BY 1 DESC) AS Date3
        , p.product_name
    FROM
        master.dbo.spt_values x
    INNER JOIN 
        (SELECT Dateadd(d,1-DATEPART(d, MIN(Date)), MIN(Date)) AS StartDate, MAX(Date) AS EndDate  FROM a) AS y
        ON x.number <= DATEDIFF(MONTH, y.StartDate, y.EndDate)
        ,(SELECT DISTINCT product_name FROM a) AS p WHERE x.type = 'P') y
LEFT JOIN
    (SELECT
          DATEADD(d,1-DATEPART(d,a.date),a.date) AS Date2
        , a.product_name
        , SUM(a.sale_qty) as Month_sale_QTY
    FROM a
    GROUP BY
          DATEADD(d,1-DATEPART(d,a.date),a.date)
        , a.product_name
    ) z ON y.Date3 = z.Date2 AND y.product_name = z.product_name

它返回以下内容:

yyyy/mm    product_name         Month_sale_QTY
---------- -------------------- ---------------------------------------
2013-05-01 product A            1.00
2013-06-01 product A            1.00
2013-07-01 product A            1.00
2013-08-01 product A            1.00
2013-09-01 product A            1.00
2013-10-01 product A            1.00
2013-11-01 product A            1.00
2013-12-01 product A            1.00
2014-01-01 product A            1.00
2014-02-01 product A            2.00
2014-03-01 product A            2.00
2013-05-01 product B            5.00
2013-06-01 product B            5.00
2013-07-01 product B            5.00
2013-08-01 product B            5.00
2013-09-01 product B            5.00
2013-10-01 product B            5.00
2013-11-01 product B            5.00
2013-12-01 product B            5.00
2014-01-01 product B            5.00
2014-02-01 product B            2.00
2014-03-01 product B            2.00

我确信它可以使用窗口函数和/或 CTE 进行优化,但作为一种快速解决方案,它也可以工作。

【讨论】:

你好 Alexey,我想我找到了关键点。你的解决方案很棒。

以上是关于如何用上个月的值替换“无”单元格的主要内容,如果未能解决你的问题,请参考以下文章

excel 如何替换单元格引用工作簿名称,例如sheet1中有单元格=sheet2!B2,如何用VB全部替换为=sheet3!B2。

如何用Apache POI读取Excel的单元格自定义名称的值

如何用表格单元格中的参数替换具有历史记录的参数的链接到。

在EXCEL中 如何用VBA查找某特定单元格并返回该单元格的行和列值?

如何用变量给excel单元格赋值

如何用vba实现在EXCEL固定区域坐标内点击单元格,显示日期控件