如何避免 SQL 中 SELECT、GROUP BY 和 ORDER BY 中的函数重复

Red*_*ine 3 sql t-sql sql-server dry

我正在编写一个统计查询,其中的值在SELECTGROUP BY和中重复ORDER BY。必须重复相同的值使得读取查询和修改它变得困难。

如何避免FLOOR(COALESCE(LEN(Body), 0) / 100)在下面的查询中重复 3-4 次。

SELECT FLOOR(COALESCE(LEN(Body), 0) / 100) * 100 as BodyLengthStart,
    (FLOOR(COALESCE(LEN(Body), 0) / 100) + 1) * 100 - 1 as BodyLengthEnd,
    COUNT(*) as MessageCount
FROM [Message]
GROUP BY FLOOR(COALESCE(LEN(Body), 0) / 100)
ORDER BY FLOOR(COALESCE(LEN(Body), 0) / 100)
Run Code Online (Sandbox Code Playgroud)

查询的输出是按消息的数百个字符划分的消息数。

体长起始 体长端 消息数
0 99 130
100 199 76
200 299 36

Ser*_*erg 5

使用交叉应用

SELECT  BodyLengthStart,
        BodyLengthEnd,
        COUNT(*)
FROM  [Message]
CROSS APPLY (
   VALUES 
      (FLOOR(COALESCE(LEN(Body), 0) / 100)) 
   ) a1(v)
CROSS APPLY (
   VALUES
      (v * 100, (v + 1) * 100 - 1)
   ) a2(BodyLengthStart, BodyLengthEnd)
GROUP BY BodyLengthStart,
         BodyLengthEnd
Run Code Online (Sandbox Code Playgroud)