首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于变量构建用例的SQL循环

基于变量构建用例的SQL循环
EN

Stack Overflow用户
提问于 2022-11-10 13:51:46
回答 1查看 35关注 0票数 0

我试图构建一个基于变量的案例查询,其思想是,当变量被填充时,case语句会相应地改变。

我的当前查询从表中获取值,并将它们分组到一个桶中。如果它始终是设置范围和范围数,这就很好了,我希望通过从原始查询中传递变量来实现这种可配置性--我只想配置桶的数量以及每个桶的f和2的值,即+5或+10。

以下是我最初的查询:

代码语言:javascript
运行
复制
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领域有任何意义的话,这就是我想要的。

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-10 14:29:12

这是未经测试的,因为没有样本数据,但这应该足以使您到达您需要的位置。我在这里使用内联计数来生成数据,但是您也可以使用理货函数,甚至可以构建自己的桶函数:

代码语言:javascript
运行
复制
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,这使得这更容易。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74390147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档