首页 > 解决方案 > 如何避免 SQL 中 SELECT、GROUP BY 和 ORDER BY 中的函数重复

问题描述

我正在编写一个统计查询,其中的值在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)

查询的输出是由数百个字符组成的消息数量。

BodyLengthStart 身体长度结束 消息计数
0 99 130
100 199 76
200 299 36

标签: sqlsql-servertsqldry

解决方案


使用 CROSS APPLY

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

推荐阅读