【问题标题】:SQL Query: Current and Previous month values in two columnsSQL 查询:两列中的当前和上个月值
【发布时间】:2018-07-29 17:40:11
【问题描述】:

需要一个 SQL 查询来将上个月的值与每月的值进行对比。

约束:不要使用任何 LAG、OVER、PARTITION、Row_number() 等。仅使用 LEFT、RIGHT 或 INNER 连接并实现它。

我有一张如下表

LoanID1 2000 年 1 月 LoanID1 2 月 3000 LoanID1 2500 年 3 月 LoanID1 1000 年 4 月 LoanID1 500 年 5 月 LoanID2 750 年 1 月 LoanID2 FEB 3500 LoanID2 2700 年 3 月 LoanID2 1500 年 4 月 LoanID2 4000 年 5 月

基本上,这些是每个 LoanID 的每月值,我需要的是我需要另一列包含上个月的值,如下表所示:

LoanID1 Jan   2000  
LoanID1 Feb   3000   2000
LoanID1 March 2500   3000
LoanID1 April 1000   2500
LoanID1 May   500    1000
LoanID2 Jan   750    
LoanID2 FEB   3500   750
LoanID2 March 2700   3500
LoanID2 April 1500   2700
LoanID2 May   4000   1500

我尝试加入同一张表,但无法实现。请指导我并给我一些启发,我该怎么做。

更新以提供实际详细信息:

插图图片:实际数据如何可用以及我在第二张图片中需要它

[这是带有记录的实际数据库

这是我需要的另一列(上个月值)


提前感谢您的指导和感谢。

【问题讨论】:

  • 正确的列使示例数据更易于阅读。
  • 您是否尝试过执行 SQL 子查询来选择 LoanID 相同但使用相反顺序的值?假设您有一些索引或值正在增加,您可以在其中建立反向顺序
  • @UmadharM 。 . .月份真的存储为字符串吗? Zoho 是数据库吗?
  • 如果您关心格式是否可读,我是否建议不要在数据中使用制表符?
  • @GordonLinoff,Months 是日期格式,例如“2016 年 11 月 1 日 00:00:00.000000”或“2016 年 11 月 1 日”只是为了示例,我在示例中给出了几个月来获取示例查询,所以我认为我可以在它之上构建。

标签: sql zoho


【解决方案1】:

你可以使用LAG函数来做到这一点

    declare @myt table (id nvarchar(50),monthnames nvarchar(50),amount int)

insert into @myt

values

('LoanID1','Jan', 2000       ),
('LoanID1','Feb', 3000       ),
('LoanID1','March',   2500   ), 
('LoanID1','April',   1000   ), 
('LoanID1','May', 500        ),
('LoanID2','Jan', 750        ),
('LoanID2','Feb', 3500       ),
('LoanID2','March',   2700   ), 
('LoanID2','April',   1500   ), 
('LoanID2','May', 4000       )

select *,LAG(Amount,1,0) Over(partition by ID order by id,MonthNumber) as PreviousMonth  from (
select *,Month(cast(monthnames+'1 2018' as date)) as MonthNumber from @myt
)x 

【讨论】:

  • 谢谢 PlaidDK,LAG 在 Zoho Reports 中不可用。
  • 我想没有人知道 Zoho 是什么
  • 它被称为 Zoho Reports,我将其用于 BI 报告。它对我来说是新的工具和领域。它使用有一些限制的 SQL 队列。
  • 在我看来,您需要某种数据仓库,而不是在具有太多限制的工具中构建临时查询。
【解决方案2】:

根据您使用的 RDBMS,您需要添加一个按日期排序的“行号”列,基于该列执行连接。 它看起来像这样

select
t1.month,
t1.value as curr_mon_val,
t2.value as prev_mon_val
from 
(select t1.month, t1.value, row_number from t1) as t1
join (select t1.value, row_number from t1 where row_number > 1) as t2
on t1.row_number = t2.row_number-1

这是您需要编写的近似值,具体取决于您的 RDBMS

【讨论】:

  • 感谢idea查询,row_number是多少?我应该为行号购买任何其他索引吗?
  • 不,行号是您应该使用 row_number(date) 函数生成的字段(同样取决于 RDBMS 可能看起来不同),将某个日期传递给它,例如月份开始日期或像 '201802 这样的字符串'。
  • 嗨亚历克斯,也许你会得到更多的想法,已经给出了两个图像截图,请看一下,我有一个月份开始日期的字符串。 prnt.sc/igy3ab 和只有特定的贷款记录图片:prntscr.com/igy3xi。那么开始日期有什么帮助呢?
  • 好的,我应该在另一列中生成并获取月份数字吗?比如MONTH(开始日期)?
  • 如果您的 RDBMS 有 row_number() 函数,您可以简单地将日期作为日期格式传递给它。这个想法是根据您想要的逻辑来创建一个具有显式行顺序的列。这里我们需要它按日期排序,所以你可以在里面传递日期。因此,在 2018 年 1 月、2018 年 2 月、2018 年 3 月的结果中,您将得到:1,2,3
猜你喜欢
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多