求一个sql语句

wwfxgm 2017-11-28 08:31:41
原来格式是:



需要结果如下:


测试数据如下:
IF EXISTS [dbo].[xxk] ;
GO
CREATE TABLE [dbo].[xxk] (
[XN] nvarchar(10) NULL ,
[XQ] NUMERIC(1) NULL ,
[KCDM] nvarchar(10) NULL ,
[KCGS] nvarchar(30) NULL ,
[SKSJ] nvarchar(255) NULL ,
[SKDD] nvarchar(255) NULL
);

GO


INSERT INTO dbo.xxk(xn,xq,kcdm,kcgs,sksj,skdd)
VALUES('2017-2018',1,'1251030','美育类','周二第5,6节{第2-3周};周二第5,6节{第5-16周}','实验大楼108西画室;实验大楼108西画室')

GO

...全文
136 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwfxgm 2017-11-29
  • 打赏
  • 举报
回复
版主说的是,不过这个表是其他系统导出来的。我无权修改。哎
吉普赛的歌 2017-11-28
  • 打赏
  • 举报
回复
其实这样的表设计是失败的, 即使我们帮你写出来又如何?
最终还是不规范,效率也不高。
加一个表就好了:
USE tempdb
GO
IF OBJECT_ID('[dbo].[xxk]') IS NOT NULL DROP TABLE dbo.xxk;
GO
CREATE TABLE [dbo].[xxk] (
xxkId INT PRIMARY KEY, --主表主键
[XN] nvarchar(10) NULL ,
[XQ] NUMERIC(1) NULL ,
[KCDM] nvarchar(10) NULL ,
[KCGS] nvarchar(30) NULL
);
GO
--增加一个从表,主从的关系是一对多
IF OBJECT_ID('[dbo].detail') IS NOT NULL DROP TABLE dbo.detail;
CREATE TABLE detail(
id INT IDENTITY(1,1) PRIMARY KEY,
[xxkId] INT NOT NULL, --外键
[SKSJ] nvarchar(255) NULL ,
[SKDD] nvarchar(255) NULL
)
SET NOCOUNT ON
CREATE INDEX ix_detail_xxkId ON detail(xxkId)
INSERT INTO dbo.xxk(xxkId, xn,xq,kcdm,kcgs) VALUES(1,'2017-2018',1,'1251030','美育类')
INSERT INTO dbo.xxk(xxkId, xn,xq,kcdm,kcgs) VALUES(2,'2017-2018',2,'1251031','丑育类')
INSERT INTO detail(xxkId,SKSJ,SKDD) VALUES(1,'周二第5,6节{第2-3周}','实验大楼108西画室')
INSERT INTO detail(xxkId,SKSJ,SKDD) VALUES(1,'周二第5,6节{第5-16周}','实验大楼108西画室')
INSERT INTO detail(xxkId,SKSJ,SKDD) VALUES(2,'周三第5,6节{第2-3周}','实验小楼109东画室')
INSERT INTO detail(xxkId,SKSJ,SKDD) VALUES(2,'周三第5,6节{第5-16周}','实验中楼109南画室')

SELECT a.*,b.SKSJ,b.SKDD
FROM xxk AS a INNER JOIN detail AS b ON a.xxkId=b.xxkId




你看看:
表设计好了, 只是一个简单的连接就能做到,不需要任何技巧,效率也高……
一般这种一个字段里“浓缩”很多内容不提倡,如果真的要做也只是一个不起眼的、与其它字段和其它信息没有关联的信息才这样做。
吉普赛的歌 2017-11-28
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('[dbo].[xxk]') IS NOT NULL DROP TABLE dbo.xxk;
GO
CREATE TABLE [dbo].[xxk] (
[XN] nvarchar(10) NULL ,
[XQ] NUMERIC(1) NULL ,
[KCDM] nvarchar(10) NULL ,
[KCGS] nvarchar(30) NULL ,
[SKSJ] nvarchar(255) NULL ,
[SKDD] nvarchar(255) NULL
);
GO
SET NOCOUNT ON
INSERT INTO dbo.xxk(xn,xq,kcdm,kcgs,sksj,skdd) VALUES('2017-2018',1,'1251030','美育类','周二第5,6节{第2-3周};周二第5,6节{第5-16周}','实验大楼108西画室;实验大楼108西画室')
INSERT INTO dbo.xxk(xn,xq,kcdm,kcgs,sksj,skdd) VALUES('2017-2018',2,'1251031','丑育类','周三第5,6节{第2-3周};周三第5,6节{第5-16周}','实验小楼109东画室;实验中楼109南画室')
--
GO
--1. 增加切分字符串表值函数
IF OBJECT_ID('dbo.Fun_Split') IS NOT NULL
DROP FUNCTION [dbo].[Fun_Split]
GO
-- =============================================
-- Author : yenange
-- Create date: 2014-03-04
-- Description: 切分字符串
-- Example : SELECT * FROM [dbo].[Fun_Split]('a,b,d,c',',')
-- =============================================
CREATE FUNCTION [dbo].[Fun_Split]
(
@str NVARCHAR(MAX),
@separator NVARCHAR(MAX)
)
RETURNS TABLE
AS
RETURN
(
SELECT ROW_NUMBER() OVER (order by (select 0)) AS rowNum, B.id
FROM (
SELECT [value] = CONVERT(XML, '<v>' + REPLACE(@str, @separator, '</v><v>') + '</v>')
) A
OUTER APPLY(
SELECT id = N.v.value('.', 'nvarchar(max)')
FROM A.[value].nodes('/v') N(v)
) B
WHERE ISNULL(B.id,'')!=''
)
GO
--2. 你的表没有主键,无法标识每一行,增加一个自增列起主键作用
--如果你有其它列( XQ ? )是唯一的,可以不要这个pkId,将后面查询的替换一下就是了
ALTER TABLE xxk ADD pkId INT IDENTITY(1,1) NOT NULL
GO
--3. 查询
;WITH cte1 AS(
SELECT a.pkId,fs.rowNum,fs.id AS SKSJ FROM xxk AS a CROSS APPLY dbo.Fun_Split(a.SKSJ,';') AS fs
),cte2 AS(
SELECT a.pkId,fs.rowNum,fs.id AS skdd FROM xxk AS a CROSS APPLY dbo.Fun_Split(a.skdd,';') AS fs
)
SELECT a.XN
,a.XQ
,a.KCDM
,a.KCGS
--,a.pkId
,cte1.SKSJ AS SKSJ
,(SELECT TOP 1 cte2.skdd FROM cte2 WHERE cte2.pkId=cte1.pkId AND cte1.rowNum=cte2.rowNum) AS SKDD
FROM xxk AS a INNER JOIN cte1 ON a.pkId=cte1.pkId



WellSoft 2017-11-28
  • 打赏
  • 举报
回复
select colName from dbo.uf_SplitList('周三第5,6节{第3-3周};周三第5,6节{第5-15周};周五第5,6节{第3-3周};周五第5,6节{第5-15周}',';','') colName 周三第5,6节{第3-3周} 周三第5,6节{第5-15周} 周五第5,6节{第3-3周} 周五第5,6节{第5-15周}
WellSoft 2017-11-28
  • 打赏
  • 举报
回复
IF OBJECT_ID('uf_SplitList') IS NOT NULL DROP FUNCTION uf_SplitList GO CREATE FUNCTION uf_SplitList( @sExpress nVarChar(4000), @Separator1 nVarChar(20), @Separator2 nVarChar(20) ) RETURNS @tb_SplitList_temp TABLE( colID Integer, colName nVarChar(500), colVal nVarChar(500) ) AS BEGIN DECLARE @i Integer, @iPos1 Integer, @iPos2 Integer, @colName nVarChar(500), @colVal nVarChar(500), @tmpColExp nVarChar(500) SET @i = 0 SET @colVal = '' SET @sExpress = LTRIM(RTRIM( @sExpress )) IF RIGHT(@sExpress,LEN(@Separator1)) != @Separator1 SET @sExpress = @sExpress + @Separator1 -- 必须以分隔符@Separator1结束 WHILE CHARINDEX( @Separator1, @sExpress ) > 0 BEGIN SET @iPos1 = CHARINDEX( @Separator1, @sExpress ) IF LEN( @Separator2 ) = 0 SET @colName = LEFT( @sExpress, @iPos1 - 1 ) ELSE BEGIN SET @tmpColExp = LEFT( @sExpress, @iPos1 - 1 ) SET @iPos2 = CHARINDEX( @Separator2, @tmpColExp ) SET @colName = SUBSTRING( @tmpColExp, 1, @iPos2 - 1 ) SET @colVal = LTRIM(RTRIM( SUBSTRING( @tmpColExp, @iPos2 + 1, LEN( @tmpColExp ) - @iPos2 ) )) END SET @i = @i + 1 SET @colName = LTRIM(RTRIM( @colName )) INSERT INTO @tb_SplitList_temp ( colID, colName,colVal ) VALUES ( @i, @colName, @colVal ) IF @Separator1 = ' ' SET @sExpress = SUBSTRING( @sExpress, @iPos1 + 1, LEN( @sExpress ) - @iPos1 ) ELSE SET @sExpress = SUBSTRING( @sExpress, @iPos1 + LEN( @Separator1 ), LEN( @sExpress ) - @iPos1 ) END IF LEN( @sExpress ) > 0 AND CHARINDEX( @Separator1, @sExpress ) = 0 BEGIN SET @i = @i + 1 SET @colName = LTRIM(RTRIM( @sExpress )) INSERT INTO @tb_SplitList_temp ( colID, colName,colVal ) VALUES ( @i, @colName, @colVal ) END RETURN END GO select * from dbo.uf_SplitList('周二第5,6节{第2-3周};周二第5,6节{第5-16周}',';','')
wwfxgm 2017-11-28
  • 打赏
  • 举报
回复
上面也有些数据是这样子的 INSERT INTO dbo.xxk(xn,xq,kcdm,kcgs,sksj,skdd) VALUES('2017-2018',1,'0626050','美育类','周三第5,6节{第3-3周};周三第5,6节{第5-15周};周五第5,6节{第3-3周};周五第5,6节{第5-15周}','东371;东371;东区机房;东区机房')

22,206

社区成员

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

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