【问题标题】:Obtaining a field associated with the previous month in Sybase在 Sybase 中获取与上个月关联的字段
【发布时间】:2021-03-12 17:09:36
【问题描述】:

在下面的查询中,我试图从表 loans 中获取同一 Uniq_ID 和同一年但上个月的 BALANCE 值,然后将其与当前行 BALANCE 值进行比较。 fdate 列看起来像 3/1/2019。我尝试按以下方式进行操作,但收到错误 "Sybase Database Error: Feature, reference containing a scalar value subquery (defined at line 13) inside a conditional expression (CASE, COALESCE, ARGN, NULLIF, or IF), is not supported"。我该如何尝试以另一种方式做到这一点?

SELECT h.UNIQUEID, f.num
(select BALANCE from loans b
    where b.UNIQ_ID = h.UNIQ_ID
    and year(b.FDATE) = year(h.FDATE) 
    and MONTH(b.fdate) = MONTH(h.fdate) - 1) AS prev_bal,
(case when prev_bal > 0 and prev_bal >= BALANCE then 1 else 0 end) as  flag
FROM loans h, perform f
where f.uniq_id = h.uniq_id 

编辑

数据如下:

fdate           UNIQUEID              NUM    BALANCE   
3/1/2019       LNSAR17224-00453434    1      16254.1  
4/1/2019       LNSAR17224-00453434    1      15643.2    

我想添加列prev_bal,如下所示:

fdate           UNIQUEID              NUM    BALANCE   prev_bal    
3/1/2019       LNSAR17224-00453434    1      16254.1    {null}     
4/1/2019       LNSAR17224-00453434    1      15643.2    16254.1 

预期输出:

UNIQUEID              NUM   prev_bal    flag
LNSAR17224-00453434    1    {null}       0
LNSAR17224-00453434    1    16254.1      1

【问题讨论】:

  • 示例数据和预期结果?
  • @VBoka 我添加了数据和预期结果。
  • fdate 列的数据类型是什么? fdate 是否存储为像 3/1/2019 这样的字符串?还是fdate 存储为datetime 数据类型,而您刚刚选择像3/1/2019 一样显示它?给定月份是否只有一个fdate 值,或者可能有多个值(例如,3/1/20193/14/20193/25/2019)?给定样本数据,查询的预期输出是什么?
  • 哪个 Sybase RDBMS 产品(ASE?IQ?SQLAnywhere?Advantage?)和版本?
  • 如果当前月份是Jan (2019),而上个月是Dec (2018),会发生什么? year() = year() 测试会失败,对吧?

标签: sql sybase sap-iq


【解决方案1】:
SELECT fdate, UNIQUEID, PNUM, BALANCE, lag(BALANCE) over (order by fdate)                
from your_table
order by fdate

【讨论】:

  • 谢谢。不幸的是,我使用的是不支持 Lag 的 Sybase。
【解决方案2】:

假设:

  • 数据库配置为不区分大小写(否则 OP 可以根据需要将所有列引用设置为 upper() 或 lower())
  • perform 表有 2 个名为 uniq_idUNIQUEID 的列(否则 OP 可以解决拼写错误)
  • previous month OP 引用当前月份之前的最后一个条目(即,不一定是前一个日历月份);所以这意味着我们可以利用max() 函数找到previous month [替代方法是查找上一个日历月份的匹配项,如果不存在则视为外连接;当然可以编码,但会等待 OP 输入]
  • OP 显示了一个输出记录的prev_balanceNULL 值;我认为这意味着可能没有任何 previous month 数据(即,我们需要考虑使用外连接)

一个查询(我相信)解决了上述问题:

select h.UNIQUEID,
       f.num,
       d1.prev_balance,
       isnull(d1.flag,0) as flag

from   loans h
join   perform f
on     f.uniq_id = h.uniq_id

left
join   (select h2.UNIQ_ID,                                       -- data associated with previous date
               h2.BALANCE as prev_balance,
               case when h2.BALANCE > 0 and h2.BALANCE >= h.BALANCE 
                    then 1 
                    else 0
               end as flag
        from   loans h2
        where  h2.UNIQ_ID = h.UNIQ_ID
        and    h2.FDATE = (select max(h3.FDATE) as prev_fdate    -- find previous date
                           from   loans h3
                           where  h3.UNIQ_ID = h2.UNIQ_ID
                           and    h3.FDATE   < h2.FDATE)
       ) as d1

on     h.uniq_id = d1.uniq_id

或者去掉一级子查询:

select h.UNIQUEID,
       f.num,
       h2.BALANCE as prev_balance,
       isnull(case when h2.BALANCE > 0 and h2.BALANCE >= h.BALANCE
                   then 1
                   else 0 
              end,0) as flag

from   loans h
join   perform f
on     h.uniq_id = f.uniq_id

left
join   loans h2
on     h.uniq_id = h2.uniq_id
and    h2.FDATE = (select max(h3.FDATE) as prev_fdate   -- find previous date
                   from   loans h3
                   where  h3.UNIQ_ID = h2.UNIQ_ID
                   and    h3.FDATE   < h2.FDATE)

注意:没有表 DDL 或示例数据,因此目前无法测试上述语法/数据准确性...

【讨论】:

    猜你喜欢
    • 2012-05-31
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2015-04-09
    • 2017-03-02
    相关资源
    最近更新 更多