SQL Server中是否有类似预处理程序指令的东西,特别是#DEFINE?

时间:2019-07-18 19:10:50

标签: sql-server sql-server-2012

每当我在SELECT中有复杂的字段时,GROUP BY最终都会看起来像垃圾,因为GROUP BY无法看到我在SELECT中定义的别名。但是,如果出现类似#DEFINE的问题,那么我可以解决这个问题。

有那样的东西吗?

2 个答案:

答案 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;
相关问题