Red*_*ine 3 sql t-sql sql-server dry
我正在编写一个统计查询,其中的值在SELECT
、GROUP 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 |
使用交叉应用
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)