指定给表达式的别名
SELECT
列表不能在
选择
列表,或
WHERE
条款。(它可供以后在语句处理中引用,在
HAVING
条款或
ORDER BY
条款)
一种方法(可能很昂贵)是使用内联视图,在其中提供别名,然后在外部查询中,可以将指定的别名作为列名引用。
SELECT v.my_alias
FROM ( -- inline view
SELECT t.foo AS my_alias
FROM ...
) v
例如
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
这可能很昂贵,因为MySQL在运行外部查询之前处理内联视图、创建和填充中间表(称为“派生表”)的方式。
除此之外,我们的选择是重复同样的表达来推导“过期天数”,例如。
SELECT t.INV_NUM
, t.INV_DDATE
, DATEDIFF(CURDATE(),FROM_UNIXTIME(t.INV_DDATE)) AS `days_past_due`
, t.INV_DBAL AS `total_ar`
, SUM(IF( DATEDIFF(CURDATE(),FROM_UNIXTIME(t.INV_DDATE)) = 0 ,t.INV_DBAL,0))
, SUM(IF( DATEDIFF(CURDATE(),FROM_UNIXTIME(t.INV_DDATE)) BETWEEN 1 AND 30 ,t.INV_DBAL,0))
, SUM(IF( DATEDIFF(CURDATE(),FROM_UNIXTIME(t.INV_DDATE)) BETWEEN 31 AND 60 ,t.INV_DBAL,0))
, SUM(IF( DATEDIFF(CURDATE(),FROM_UNIXTIME(t.INV_DDATE)) BETWEEN 61 AND 90 ,t.INV_DBAL,0))
, SUM(IF( DATEDIFF(CURDATE(),FROM_UNIXTIME(t.INV_DDATE)) > 90 ,t.INV_DBAL,0))
FROM invoice_table t
WHERE t.INV_CODE = 'the_client code'