我正在尝试从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”。
答案 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';
希望这对其他人有帮助。