sql语句的写法求教

wwfxgm 2017-03-30 08:55:11



我下面给贴实例数据出来


CREATE TABLE [dbo].[Sheet5] (
[ID] nvarchar(255) NULL ,
[项目名称] nvarchar(255) NULL ,
[负责人] nvarchar(255) NULL ,
[参与人员] nvarchar(255) NULL
)


GO

-- ----------------------------
-- Records of Sheet5
-- ----------------------------
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'1', N'AAAA', N'A', N'张三,丽,英,胜,亮,朱(学)')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'2', N'BBB', N'B', N'霞,平,陈(学),李(学)')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'3', N'CCCC', N'C', N'赵,圣(学)')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'4', N'DDDD', N'D', N'')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'5', N'EEEE', N'E', N'')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'希望得到如下结果', N'', N'', N'')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'ID', N'项目名称', N'负责人', N'参与人员')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'1', N'AAAA', N'A', N'张三')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'1', N'AAAA', N'A', N'丽')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'1', N'AAAA', N'A', N'英')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'1', N'AAAA', N'A', N'胜')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'1', N'AAAA', N'A', N'亮')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'1', N'AAAA', N'A', N'朱(学)')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'2', N'BBB', N'B', N'霞')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'2', N'BBB', N'B', N'平')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'2', N'BBB', N'B', N'陈(学)')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'2', N'BBB', N'B', N'李(学)')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'3', N'CCCC', N'C', N'赵')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'3', N'CCCC', N'C', N'圣(学)')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'4', N'DDDD', N'D', N'')
GO
GO
INSERT INTO [dbo].[Sheet5] ([ID], [项目名称], [负责人], [参与人员]) VALUES (N'5', N'EEEE', N'E', N'')
GO
GO
...全文
97 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
道素 2017-04-01
  • 打赏
  • 举报
回复

SELECT s.ID,s.项目名称,s.负责人,d.n FROM sheet5 AS s
CROSS APPLY(VALUES(CONVERT(XML,'<n>'+REPLACE(s.参与人员,',','</n><n>')+'</n>'))) c(x)
CROSS APPLY(SELECT s.b.value('.','nvarchar(10)') FROM c.x.nodes('n')s(b)) d(n)

ID	项目名称	负责人	n
1	AAAA	A	张三
1	AAAA	A	丽
1	AAAA	A	英
1	AAAA	A	胜
1	AAAA	A	亮
1	AAAA	A	朱(学)
2	BBB	B	霞
2	BBB	B	平
2	BBB	B	陈(学)
2	BBB	B	李(学)
3	CCCC	C	赵
3	CCCC	C	圣(学)
Tiger_Zhao 2017-03-30
  • 打赏
  • 举报
回复
;WITH a AS (
SELECT id,
参与人员,
1 iStart,
CHARINDEX(',',参与人员) iEnd
FROM sheet5
UNION ALL
SELECT id,
参与人员,
iEnd+1,
CHARINDEX(',',参与人员,iEnd+1)
FROM a
WHERE iEnd <> 0
),
b AS (
SELECT id,
ROW_NUMBER() OVER(PARTITION BY id ORDER BY iStart) rn,
SUBSTRING(参与人员,
iStart,
CASE WHEN iEnd=0 THEN
Len(参与人员)+1-iStart
ELSE
iEnd-iStart
END) 参与人员
FROM a
)
SELECT s.id,
s.项目名称,
s.负责人,
b.参与人员
FROM sheet5 s
JOIN b
ON s.id = b.id
ORDER BY s.id, b.rn

         id 项目名称 负责人   参与人员
----------- -------- -------- --------------------
1 AAAA A 张三
1 AAAA A 丽
1 AAAA A 英
1 AAAA A 胜
1 AAAA A 亮
1 AAAA A 朱(学)
2 BBB B 霞
2 BBB B 平
2 BBB B 陈(学)
2 BBB B 李(学)
3 CCCC C 赵
3 CCCC C 圣(学)
4 DDDD D
5 EEEE E
二月十六 2017-03-30
  • 打赏
  • 举报
回复
引用 2 楼 wwfxgm 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] 创建分隔函数:
ALTER FUNCTION dbo.f_splitstr(@SourceSql   NVARCHAR(MAX),@StrSeprate   VARCHAR(100))   
  RETURNS   @temp   TABLE(F1   VARCHAR(100))   
  AS     
  BEGIN   
  DECLARE   @ch   AS   VARCHAR(100)   
  SET   @SourceSql=@SourceSql+@StrSeprate     
  WHILE(@SourceSql<>'')   
                  BEGIN   
                  SET   @ch=LEFT(@SourceSql,CHARINDEX(@StrSeprate,@SourceSql,1)-1)   
  INSERT   @temp   VALUES(@ch)   
  SET   @SourceSql=STUFF(@SourceSql,1,CHARINDEX(@StrSeprate,@SourceSql,1),'')   
                  END   
  RETURN   
  END

GO
语句:
SELECT  a.ID ,
        a.项目名称 ,
        a.负责人,
		t.f1 AS 参与人员
FROM    sheet5 a
        CROSS APPLY ( SELECT    f1
                      FROM      dbo.f_splitstr(( SELECT 参与人员
                                                 FROM   dbo.Sheet5 b
                                                 WHERE  a.ID = b.ID
                                               ), ',')
                    ) t
结果:
这还需要自己创建分隔函数呀。有没有系统自带的功能?[/quote] 系统没有。这种处理方式应该很常见,所以这个函数也很有用,建一个挺好的
wwfxgm 2017-03-30
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
创建分隔函数:
ALTER FUNCTION dbo.f_splitstr(@SourceSql   NVARCHAR(MAX),@StrSeprate   VARCHAR(100))   
  RETURNS   @temp   TABLE(F1   VARCHAR(100))   
  AS     
  BEGIN   
  DECLARE   @ch   AS   VARCHAR(100)   
  SET   @SourceSql=@SourceSql+@StrSeprate     
  WHILE(@SourceSql<>'')   
                  BEGIN   
                  SET   @ch=LEFT(@SourceSql,CHARINDEX(@StrSeprate,@SourceSql,1)-1)   
  INSERT   @temp   VALUES(@ch)   
  SET   @SourceSql=STUFF(@SourceSql,1,CHARINDEX(@StrSeprate,@SourceSql,1),'')   
                  END   
  RETURN   
  END

GO
语句:
SELECT  a.ID ,
        a.项目名称 ,
        a.负责人,
		t.f1 AS 参与人员
FROM    sheet5 a
        CROSS APPLY ( SELECT    f1
                      FROM      dbo.f_splitstr(( SELECT 参与人员
                                                 FROM   dbo.Sheet5 b
                                                 WHERE  a.ID = b.ID
                                               ), ',')
                    ) t
结果:
这还需要自己创建分隔函数呀。有没有系统自带的功能?
二月十六 2017-03-30
  • 打赏
  • 举报
回复
创建分隔函数:
ALTER FUNCTION dbo.f_splitstr(@SourceSql   NVARCHAR(MAX),@StrSeprate   VARCHAR(100))   
RETURNS @temp TABLE(F1 VARCHAR(100))
AS
BEGIN
DECLARE @ch AS VARCHAR(100)
SET @SourceSql=@SourceSql+@StrSeprate
WHILE(@SourceSql<>'')
BEGIN
SET @ch=LEFT(@SourceSql,CHARINDEX(@StrSeprate,@SourceSql,1)-1)
INSERT @temp VALUES(@ch)
SET @SourceSql=STUFF(@SourceSql,1,CHARINDEX(@StrSeprate,@SourceSql,1),'')
END
RETURN
END

GO



语句:
SELECT  a.ID ,
a.项目名称 ,
a.负责人,
t.f1 AS 参与人员
FROM sheet5 a
CROSS APPLY ( SELECT f1
FROM dbo.f_splitstr(( SELECT 参与人员
FROM dbo.Sheet5 b
WHERE a.ID = b.ID
), ',')
) t



结果:





22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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