快速提问。我正在经历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)”
谢谢!
答案 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