【发布时间】:2018-02-14 12:14:16
【问题描述】:
请考虑以下代码:
Declare @MyMinMaxTable Table
(
[Min] int,
[Max] int,
[Desc] NVARCHAR(50)
)
Insert into @MyMinMaxTable
values (0,12,N'Child'),
(13,19,N'Teenager'),
(20,25,N'Youth'),
(25,40,N'Middle-aged'),
(40,99,N'Old')
Declare @MyTable Table
(
Id int identity(1,1),
[Year] int,
Age int,
MyCol2 int,
MyCol3 int null
)
Insert into @MyTable
([Year], Age, MyCol2, MyCol3)
values
(2012, 10, 1 , 1),
(2012, 28, 2 , 3),
(2012, 14, 1 , 7),
(2012, 24, 3 , 3),
(2012, 80, 1 , 6),
(2012, 39, 1 , 3),
(2012, 45, 1 , 5),
(2012, 23, 2 , 6),
(2012, 72, 3 , 8),
(2012, 17, 1 , null),
(2012, 62, 4 , 9),
(2012, 20, 1 , null),
(2012, 5, 1 , 9),
(2012, 8, 1 , 9),
(2012, 25, 1 , null),
(2012, 41, 2 , 2),
(2012, 26, 1 , 2),
(2012, 33, 4 , 2),
(2012, 40, 1 , 2),
(2012, 33, 2 , 3),
(2012, 41, 1 , 5),
(2012, 53, 1 , null),
(2012, 37, 1 , 3)
Declare @Result Table
(
C0 NVARCHAR(50),
c1 decimal(5,2),
C2 decimal(5,2),
C3 decimal(5,2)
)
CURSOR 部分:
DECLARE @Min int;
DECLARE @Max int;
DECLARE @Desc nvarchar(50);
DECLARE mycur CURSOR
FOR
SELECT [min],
[max],
[Desc]
FROM @MyMinMaxTable
OPEN mycur
FETCH NEXT FROM mycur INTO @Min, @Max, @Desc
WHILE (@@fetch_status = 0)
BEGIN
INSERT INTO @Result
SELECT @Desc As c0,
(Cast(COUNT(CASE when Age >= @Min AND Age <= @Max THEN 1 END) as decimal(5,2)) / cast(COUNT(Id) as decimal(5,2))) As c1,
(Cast(COUNT(CASE when MyCol2 = 1 AND MyCol3 IS NOT NULL THEN 1 END) as decimal(5,2)) / cast(COUNT(CASE when Age >= @Min AND Age <= @Max THEN 1 END) as decimal(5,2))) As c2,
(Cast(COUNT(CASE when Age >= @Min AND Age <= @Max ANd MyCol2 = 1 THEN 1 END) as decimal(5,2)) / cast(COUNT(CASE when MyCol2 = 1 THEN 1 END) as decimal(5,2))) As c3
FROM @MyTable AS td
FETCH NEXT FROM mycur INTO @Min, @Max, @Desc
END
CLOSE mycur
DEALLOCATE mycur
SELECT * FROM @Result
问题是我想删除CURSOR 并编写一个没有它的查询。在这种情况下怎么可能?
【问题讨论】:
-
编辑您的问题并提供示例数据和所需结果。我不想理解光标代码。
-
@GordonLinoff 我更新了我的问题。感谢您的关注
-
你能把合理的、描述性的列名放在这里吗? C1 和 C2 并没有告诉读者任何事情,在这里很难看到这个概念。您似乎想在年龄范围内对人员进行分类,但这些表定义与概念没有具体联系。 'min' 和 'max' 之类的列名也没有帮助。另外,为什么 C3 可以为空,这是否与概念相关?
-
@PittsburghDBA 感谢您的关注。 C1 , C2 , ...在结果表中,它们的名称无关紧要。我觉得我的问题很简单。我有一张表,我想在每个班级中分类一个做一些计算
-
查看 CASE 块中的 MyCol1、MyCol2 和 MyCol3 很难确定业务规则的逻辑。这些列确实有意义,因为它们正在驱动 CASE 逻辑。是年龄吗?是上课的次数吗?他们是旗帜吗?业务目标是什么?这里可能有许多有效的答案,但逻辑过于混乱,以至于几乎不值得研究。
标签: sql sql-server cursor sql-server-2014