我试图构建一个基于变量的案例查询,其思想是,当变量被填充时,case语句会相应地改变。
我的当前查询从表中获取值,并将它们分组到一个桶中。如果它始终是设置范围和范围数,这就很好了,我希望通过从原始查询中传递变量来实现这种可配置性--我只想配置桶的数量以及每个桶的f和2的值,即+5或+10。
以下是我最初的查询:
SELECT subq.Bucket, COUNT(*) 'Count'
FROM
(
SELECT
CASE
WHEN R.Value < 10 THEN '0-10'
WHEN R.Value Between 10 and 20 THEN '10-20'
WHEN R.Value Between 20 and 30 THEN '20-30'
WHEN R.Value Between 30 and 40 THEN '30-40'
WHEN R.Value > 40 THEN '40+'
END Bucket
FROM Table R
Where DateTime Between '2022-10-01' and '2022-11-10' and Type = 1
) subq
GROUP BY subq.Bucket
如果在SQL领域有任何意义的话,这就是我想要的。
DECLARE @NoRows Int, @Range Int, @Count Int, @StartRange Int
Set @NoRows = 5
Set @StartRange = 0
Set @Range = 10
Set @Count = 0
SELECT subq.Bucket, COUNT(*) 'Count'
FROM
(
WHILE @NoRows <= @Count
BEGIN
SELECT
(
CASE
WHEN R.Value Between @StartRange and @Range THEN '@StartRange-@Range'
SET @Count = @Count + 1
SET @StartRange = @StartRange + @Range
END
WHEN R.Value > @StartRange THEN '@StartRange'
END Bucket
FROM Table R
Where DateTime Between '2022-10-01' and '2022-11-10' and Type = 1
) subq
GROUP BY subq.Bucket
发布于 2022-11-10 14:29:12
这是未经测试的,因为没有样本数据,但这应该足以使您到达您需要的位置。我在这里使用内联计数来生成数据,但是您也可以使用理货函数,甚至可以构建自己的桶函数:
DECLARE @NoRows int = 5,
@Range int = 10,
@StartRange int = 0;
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT TOP(@NoRows)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2), --UP to 100 rows, add more cross joins for more rows
Buckets AS(
SELECT @StartRange + ((I-1)*@Range) AS RangeStart,
@StartRange + ((I)*@Range) AS RangeEnd
FROM Tally)
SELECT YT.{Needed Columns},
CASE WHEN B.RangeStart IS NULL THEN CONCAT(@NoRows * @Range,'+')
ELSE CONCAT(B.RangeStart,'-', B.RangeEnd-1)
END AS Bucket
FROM dbo.YourTable YT
LEFT JOIN Buckets B ON YT.YourColumn >= B.RangeStart
AND YT.YourColumn < B.RangeEnd;
在Server 2022+中,您甚至有内置函数GENERATE_SERIES
,这使得这更容易。
https://stackoverflow.com/questions/74390147
复制相似问题