sqlserver 如何用Sql快速实现一行变多行

Kings_cool 2020-04-22 03:12:57
为方便分类,需要把一行数据分成多行(具体分几行不定)
例如
日期 时间 早a 中a 晚a 早b 中b 晚b
张三 4月22号 1 0 0 1 2 3
对前后进行比对,发现中午和晚上的数据异常。
现在需要把
张三 04-22 1 0 0 1 2 3 这一行数据
变成
张三 04-22 中午异常
张三 04-22 晚上异常

同理,有一些数据只需要变1条,有一些需要变3条
这个该怎么实现呢。求前辈们帮忙
...全文
578 3 点赞 打赏 收藏 举报
写回复
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
RINK_1 2020-04-22


CREATE TABLE #T
(NAME VARCHAR(10),
 DT VARCHAR(10),
 M_A INT,
 N_A INT,
 E_A INT,
 M_B INT,
 N_B INT,
 E_B INT)

INSERT INTO #T
SELECT 'A','0422',1,0,0,1,2,3

WITH CTE
AS
(SELECT NAME,DT,M_A,'MORNING' AS TYPE FROM #T UNION ALL
SELECT NAME,DT,N_A,'NOON' AS TYPE FROM #T UNION ALL
SELECT NAME,DT,E_A,'EVENING' AS TYPE FROM #T UNION ALL
SELECT NAME,DT,-1*M_B,'MORNING' AS TYPE FROM #T UNION ALL
SELECT NAME,DT,-1*N_B,'NOON' AS TYPE FROM #T UNION ALL
SELECT NAME,DT,-1*E_B,'EVENING' AS TYPE FROM #T)

SELECT NAME,DT,TYPE,CASE WHEN TYPE='MORNING' THEN '早上异常' 
WHEN TYPE='NOON' THEN '中午异常' ELSE '晚上异常' END AS RESULT
FROM CTE
GROUP BY NAME,DT,TYPE
HAVING SUM(M_A)<>0
  • 打赏
  • 举报
回复
Mr_shutp 2020-04-22
DECLARE @aa AS NVARCHAR(20), @bb AS NVARCHAR(20), @cc AS NVARCHAR(20), @dd AS NVARCHAR(20), @ee AS NVARCHAR(20), @ff AS NVARCHAR(20), @gg AS NVARCHAR(20), @hh AS NVARCHAR(20); DECLARE C_CUR CURSOR FAST_FORWARD FOR SELECT a,b,c,d,e,f,g,h FROM stu; OPEN C_CUR; FETCH NEXT FROM C_Employees INTO @aa,@bb,@cc,@dd,@ee,@ff,@gg,@hh; WHILE @@FETCH_STATUS=0 BEGIN while(@cc != @ff) begin insert into s_status(aa,bb,cc)values(@aa,@bb,'早上异常') break end while (@dd != @gg) begin insert into s_status(aa,bb,cc)values(@aa,@bb,'中午异常') break end while (@ee != @hh) begin insert into s_status(aa,bb,cc)values(@aa,@bb,'晚上异常') break end FETCH NEXT FROM C_Employees INTO @aa,@bb,@cc,@dd,@ee,@ff,@gg,@hh; END CLOSE C_CUR; DEALLOCATE C_CUR;
  • 打赏
  • 举报
回复
Mr_shutp 2020-04-22
可以用游标循环做对比,需要的结果插入表中
  • 打赏
  • 举报
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2020-04-22 03:12
社区公告
暂无公告