使用mysql生成当前30、60、90天的老化报告

时间:2019-06-10 20:27:41

标签: php mysql

我正在尝试从mysql表中获取帐单的帐龄。该表具有每个发票的client_id,amount_due和Due_date。我正在一次从一个客户那里获取每个客户的所有发票。

我已经在SO中寻找解决方案,并找到了几种解决方案,但是当我尝试实现它们时,却遇到了同样的错误...

  

“未知列'days_past_due”。...

我已经尝试了多个mysql代码片段,并且每个错误均以相同的方式进行了处理,我研究了该错误,并且似乎无法在同一级别上使用列别名(对此不太了解)。我先试了(注意:INV_DDATE存储为unix时间戳,为11位整数)

select INV_NUM
     , INV_DDATE
     , DATEDIFF(CURDATE(), FROM_UNIXTIME(INV_DDATE)) days_past_due
     , INV_DBAL total_ar
     , SUM(IF(days_past_due = 0, total_ar, 0))
     , SUM(IF(days_past_due BETWEEN 1 AND 30, total_ar, 0))
     , SUM(IF(days_past_due BETWEEN 31 AND 60, total_ar, 0))
     , SUM(IF(days_past_due BETWEEN 61 AND 90, total_ar, 0))
     , SUM(IF(days_past_due > 90, total_ar, 0)) 
  from invoice_table 
 where INV_CODE = 'the_client code'
  

1054-“字段列表”中的未知列“ days_past_due”。

4 个答案:

答案 0 :(得分:0)

别名不能用引号引起来。

select INV_NUM, INV_DDATE, DATEDIFF(CURDATE(), FROM_UNIXTIME(INV_DDATE)) AS days_past_due, INV_DBAL as total_ar ...

如果您需要使用一些东西,则必须是反引号(`)。

select INV_NUM, INV_DDATE, DATEDIFF(CURDATE(), FROM_UNIXTIME(INV_DDATE)) AS `days_past_due`, INV_DBAL as `total_ar` ...

答案 1 :(得分:0)

您不能在SELECT块中重复使用别名。您应将所有出现的send替换为days_past_due或使用变量/子查询。

答案 2 :(得分:0)

RLS_SecurityKey = CALCULATE(FIRSTNONBLANK(People[Group],People[Group]), FILTER(ALL('PEOPLE'),USERPRINCIPALNAME() = People[Email])) 列表或SELECT子句中的其他地方不能引用分配给SELECT列表中表达式的别名。 (它可用于稍后在语句处理中的WHERE子句或HAVING子句中进行引用。)

一种方法(可能很昂贵)是使用内联视图,在其中提供别名,然后在外部查询中,可以将分配的别名引用为列名。

ORDER BY

例如

SELECT v.my_alias 
  FROM ( -- inline view 
         SELECT t.foo AS my_alias 
           FROM ...
       ) v

这可能是昂贵的,因为在外部查询运行之前,MySQL处理内联视图,创建并填充中间表(称为“派生表”)的方式。


除此之外,我们的选择是重复相同的表达式以得出“ days_past_due”,例如

SELECT v.INV_NUM
     , v.INV_DDATE
     , v.days_past_due
     , v.total_ar
     , SUM(IF( v.days_past_due = 0               ,v.total_ar,0))
     , SUM(IF( v.days_past_due BETWEEN  1 AND 30 ,v.total_ar,0))
     , SUM(IF( v.days_past_due BETWEEN 31 AND 60 ,v.total_ar,0))
     , SUM(IF( v.days_past_due BETWEEN 61 AND 90 ,v.total_ar,0))
     , SUM(IF( v.days_past_due > 90              ,v.total_ar,0))
  FROM (
         SELECT t.INV_NUM
              , t.INV_DDATE
              , DATEDIFF(CURDATE(), FROM_UNIXTIME(t.INV_DDATE)) AS `days_past_due`
              , t.INV_DBAL                                      AS `total_ar`
           FROM invoice_table t
          WHERE t.INV_CODE = 'the_client code'
       ) v

答案 3 :(得分:0)

好的, 感谢所有人的建议,是的,我跳过了别名,只使用了表达式。工作完美!     选择     INV_NUM,     INV_DDATE,     sum(DATEDIFF(curdate(),FROM_UNIXTIME(INV_DDATE))<30则INV_DBAL否则0结束的情况)为ZeroToThirty,     sum(当DATEDIFF(curdate(),FROM_UNIXTIME(INV_DDATE))> 31并且DATEDIFF(curdate(),FROM_UNIXTIME(INV_DDATE))<60时INV_DBAL否则为0结束)为ThirtyToSixty,     sum(当DATEDIFF(curdate(),FROM_UNIXTIME(INV_DDATE))> 61并且DATEDIFF(curdate(),FROM_UNIXTIME(INV_DDATE))<90时INV_DBAL否则为0结束)为SixtyToNinety,     sum(DATEDIFF(curdate(),FROM_UNIXTIME(INV_DDATE))> 120然后INV_DBAL否则0结束的情况)为NinetyToOneTwenty     来自发票表     其中INV_CODE ='the_client code';

希望这对其他人有帮助。