select语句根据字段进行不同操作

小白索引 2014-07-25 10:56:41
不知道怎么精确描述问题,我把问题详细说一下:)
T1表中数据如下:
ID CardID Flag
---------------------------
1 100 1
2 100 1
3 100 0
4 100 1
5 100 1
6 100 1
7 100 0
8 101 1
9 101 1
10 101 1
11 101 0
-----------------------------
数据按照ID排序后,Flag字段有以下意义:
从1开始,到0为止,表示一个状态;从下一个1开始,到0结束,表示另一个状态。
现在要按照Flag表示的意义,按照状态对表进行分组:

declare @cnt int;
set @cnt = 1;
select ID, CardID, Flag,
case when Flag = 1 then @cnt
else @cnt
end as Group,
case when Flag = 0 then (select @cnt=@cnt+1) end --select @cnt=@cnt+1 这句有语法错误
from T1

select @cnt=@cnt+1 这句有语法错误,具体语法怎么处理,或者该怎么解决这个问题?多谢。
...全文
224 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
小白索引 2014-07-26
  • 打赏
  • 举报
回复
求助~~~~~~~
小白索引 2014-07-25
  • 打赏
  • 举报
回复
引用 2 楼 Tiger_Zhao 的回复:
这么重要的信息应该加个字段 GroupID
-- 先设 Flag=0 记录的 GroupID
UPDATE T1
   SET GroupID = (SELECT COUNT(TX.*)+1 FROM T1 TX WHERE TX.ID < T1.ID)
 WHERE Flag = 0

-- 先设 Flag=1 记录的 GroupID 就从后面的 Flag=0 记录中来
UPDATE T1
   SET GroupID = (SELECT MIN(GroupID) FROM T1 TX WHERE TX.Flag = 0 AND TX.ID > T1.ID)
   AND Flag = 1
多谢,但是这张表是从其他公司的数据表中查询出来的,我们不能做修改。
小白索引 2014-07-25
  • 打赏
  • 举报
回复
引用 1 楼 sc273607742 的回复:

select *, (select min(id) from t1 where flag=0 and a.id<=id) 
from t1 a
这样?
你好,多谢开阔了我的思路。 但是T1不是一个表,而是一个数据集。

select *, (select min(id) from t1 where flag=0 and a.id<=id) --t1 对象名无效
from 
    (select * from other_table
    ) T1 a
Tiger_Zhao 2014-07-25
  • 打赏
  • 举报
回复
这么重要的信息应该加个字段 GroupID
-- 先设 Flag=0 记录的 GroupID
UPDATE T1
SET GroupID = (SELECT COUNT(TX.*)+1 FROM T1 TX WHERE TX.ID < T1.ID)
WHERE Flag = 0

-- 先设 Flag=1 记录的 GroupID 就从后面的 Flag=0 记录中来
UPDATE T1
SET GroupID = (SELECT MIN(GroupID) FROM T1 TX WHERE TX.Flag = 0 AND TX.ID > T1.ID)
AND Flag = 1
哥眼神纯洁不 2014-07-25
  • 打赏
  • 举报
回复

select *, (select min(id) from t1 where flag=0 and a.id<=id) 
from t1 a
这样?
哥眼神纯洁不 2014-07-25
  • 打赏
  • 举报
回复
引用 7 楼 jay173361646 的回复:
引用
select *, (select min(id) from other_table where flag=0 and a.id<=id) --t1 对象名无效 from other_table a
不是这样的 是多个表联合查询出来的结果集,我写成那样就是示意一下。不好意思,让你误解了。
你用 with t1 as( 你的语句 ) 套一下不就行了
Tiger_Zhao 2014-07-25
  • 打赏
  • 举报
回复
SELECT 语句只会对 @cnt 取一次值。
要自增就要能多次调用,必须开游标、遍历;但是开游标返回结果又不方便了,还得开临时表存结果。

所以用我的那种方式更方便,不用永久字段就用临时表好了。
小白索引 2014-07-25
  • 打赏
  • 举报
回复
引用 8 楼 u011015550 的回复:
引用
declare @cnt int; set @cnt = 1; select ID, CardID, Flag, case when Flag = 1 then @cnt else @cnt end as Group, case when Flag = 0 then (select @cnt=@cnt+1) end --select @cnt=@cnt+1 这句有语法错误 from T1
case when Flag = 0 then (select @cnt=@cnt+1) end --select @cnt=@cnt+1 这句有语法错误 then后面只能是常量表达式,你写成了赋值语句,如果从意思上说你只是想显示值@cnt加1的话 可以改成 case when Flag = 0 then (@cnt+1) end
你好,我就是想要给@cnt赋值,使其自增。
Neo_whl 2014-07-25
  • 打赏
  • 举报
回复
引用
declare @cnt int; set @cnt = 1; select ID, CardID, Flag, case when Flag = 1 then @cnt else @cnt end as Group, case when Flag = 0 then (select @cnt=@cnt+1) end --select @cnt=@cnt+1 这句有语法错误 from T1
case when Flag = 0 then (select @cnt=@cnt+1) end --select @cnt=@cnt+1 这句有语法错误 then后面只能是常量表达式,你写成了赋值语句,如果从意思上说你只是想显示值@cnt加1的话 可以改成 case when Flag = 0 then (@cnt+1) end
小白索引 2014-07-25
  • 打赏
  • 举报
回复
引用
select *, (select min(id) from other_table where flag=0 and a.id<=id) --t1 对象名无效 from other_table a
不是这样的 是多个表联合查询出来的结果集,我写成那样就是示意一下。不好意思,让你误解了。
哥眼神纯洁不 2014-07-25
  • 打赏
  • 举报
回复
引用 3 楼 jay173361646 的回复:
[quote=引用 1 楼 sc273607742 的回复:]

select *, (select min(id) from t1 where flag=0 and a.id<=id) 
from t1 a
这样?
你好,多谢开阔了我的思路。 但是T1不是一个表,而是一个数据集。

select *, (select min(id) from t1 where flag=0 and a.id<=id) --t1 对象名无效
from 
    (select * from other_table
    ) T1 a
[/quote] select *, (select min(id) from other_table where flag=0 and a.id<=id) --t1 对象名无效 from other_table a
Tiger_Zhao 2014-07-25
  • 打赏
  • 举报
回复
开一个一对一的辅助表 (ID,GroupID)

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧