使用别名 - SQL

时间:2018-01-09 17:58:53

标签: sql sql-server ssms

快速提问。我正在经历SQL挑战,在我看来,使用Alias在某些情况下有效,但在其他情况下无效。这似乎是武断的,但我知道我错过了什么。

考虑代码A:

Select DOW = datename(dw, orderdate), Revenue = sum(subtotal), Orders = count(*), RPO = sum(subtotal) from sales.salesorderheader
where year(orderdate) = 2008
and OnlineOrderFlag = 0
Group by datename(dw, orderdate)
Order by RPO desc

这很好用。我喜欢在部分代码的顺序中,我可以通过Alias Revenue引用sum(小计)。

如果我尝试对Group By行执行相同的操作,则它不起作用。即以下不起作用:

Select DOW = datename(dw, orderdate), Revenue = sum(subtotal), Orders = count(*), RPO = sum(subtotal) from sales.salesorderheader
where year(orderdate) = 2008
and OnlineOrderFlag = 0
Group by DOW
Order by RPO desc

为什么我可以在Order by子句中使用别名,但不能使用group by子句?我被迫输入完整的“按日期分组(dw,orderdate)”

谢谢!

2 个答案:

答案 0 :(得分:3)

这是SQL Server的正确行为。某些数据库允许GROUP BY中的别名。 SQL Server不是其中之一。

数据库在HAVING子句中的别名也不一致。但是,大多数数据库允许ORDER BY中的别名 - 某些(例如Hive)甚至需要别名,不允许使用函数表达式。

答案 1 :(得分:1)

如果您不想重复两次表达,可以使用cross apply

SELECT ca.DOW,
       Revenue = Sum(subtotal),
       Orders = Count(*),
       RPO = Sum(subtotal)
FROM   sales.salesorderheader
       CROSS apply (SELECT Datename(dw, orderdate)) ca (DOW)
WHERE  Year(orderdate) = 2008
       AND OnlineOrderFlag = 0
GROUP  BY ca.DOW
ORDER  BY RPO DESC