如何用上个月的值替换“无”单元格
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 语句,那么有人可以帮助您调整它。code
select 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的单元格自定义名称的值