每当我在SELECT
中有复杂的字段时,GROUP BY
最终都会看起来像垃圾,因为GROUP BY
无法看到我在SELECT
中定义的别名。但是,如果出现类似#DEFINE的问题,那么我可以解决这个问题。
有那样的东西吗?
答案 0 :(得分:2)
这与预处理器指令不相似,但是清除凌乱的GROUP BY语句的一种方法是将复杂的SELECT语句打包到子查询中,然后从外部查询中执行GROUP BY。这有助于清理一些东西。
例如:
SELECT
dataset.keyvalue,
SUM(dataset.amt) as total
FROM
(SELECT
field1 + field2 + field3 as keyvalue,
OrderQty as amt
FROM dbo.table1) as dataset
GROUP BY dataset.keyvalue
答案 1 :(得分:1)
是的,它被称为SQLCMD Mode:
:setvar <var> <value>
:SETVAR DATABASENAME "adventureworks2014"
USE $(DATABASENAME);
:setvar col_list "col1,col2,col3"
SELECT $(col_list), COUNT(*) AS cnt
FROM tab
GROUP BY $(col_list);
编辑:
我认为正确的方法是使用CROSS APPLY
:
SELECT s.col1, s.col2, COUNT(*) AS cnt
FROM t
CROSS APPLY (SELECT col1 = complex_expression, col2 = complex_expression2) AS s
-- the expression is defined once at the same level
GROUP BY s.col1, s.col2;