按计算列标签分组的列名无效

g9icjywg  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(316)

我正在尝试运行此查询以按月份和按帐户获取销售额:

select 
    left(cast(datekey as varchar(8)), 6) as themonth, 
    account, sum(sales) 
from 
    Sales
where 
    datekey > 20150101
group by 
    themonth, account
order by 
    themonth asc
``` `datekey` 是一个 `int` 日期采用yyyymmdd格式。
我收到了这个信息:
消息207,16级,状态1,第3行
列名“themonth”无效
为什么列名无效?
我假设错误消息没有意义,那么这个查询还有什么问题?
ivqmmu1c

ivqmmu1c1#

sql server不允许在中重用别名 GROUP BY 子句(其他数据库,如mysql,也允许这样做)。所以,这里的一个选择就是重复 SELECT 条款:

SELECT
    LEFT(CAST(datekey AS varchar(8)), 6) AS themonth,
    account,
    SUM(sales)
FROM Sales
WHERE datekey > 20150101
GROUP BY
    LEFT(CAST(datekey AS varchar(8)), 6),
    account
ORDER BY
    themonth;

请注意,可以 ORDER BY 别名,因此可以保留查询的这部分。

pvabu6sv

pvabu6sv2#

除了@timbiegeleisen之外,还有一种方法是使用子查询并实现结果

Select     themonth, account, sum(sales) 
from
(select 
    left(cast(datekey as varchar(8)), 6) as themonth, 
    account, sales 
from 
    Sales
where 
    datekey > 20150101) as t
group by 
    themonth, account
order by 
    themonth asc
azpvetkf

azpvetkf3#

不能在中重用别名 SELECT 在大多数查询中。但是,可以在中定义别名 FROM 子句使用 APPLY . 所以:

select v.themonth, s.account, sum(s.sales) 
from Sales s cross apply
     (values (left(cast(s.datekey as varchar(8)), 6))) v(themonth)
where s.datekey > 20150101
group by v.themonth, s.account
order by v.themonth asc;

我不知道你的约会钥匙长什么样。但是,如果它是整数,您只需执行以下操作:

select v.themonth, s.account, sum(s.sales) 
from Sales s cross apply
     (values (floor(s.datekey / 100)) v(themonth)
where s.datekey > 20150101
group by v.themonth, s.account
order by v.themonth asc;

严格来说 floor() 不是必需的,但它清楚地表明您需要整数。

相关问题