当前位置:首页 » 编程语言 » SQL一条记录变成多条拆分
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

SQL一条记录变成多条拆分

发布时间: 2023-01-08 03:47:03

❶ oracle sql 将一条记录复制拆分成多条,怎样按条件执行循环

用oracle start with connect by 可以实现。

oracle start with connect by 用法oracle 提供了start with connect by 语法结构可以实现递归查询。

1. 一个简单举例:
SQL> select * from test;

BILL_MONTH DAY_NUMBER MSISDN
-------------------- ---------- --------------------
200803 1 13800
200803 3 13800
200803 2 13800
200803 2 13801
200803 4 13804
200803 5 13804
200803 7 13804
200803 8 13804
200803 6 13802
200803 6 13801
200803 7 13801
200803 8 13801
12 rows selected

SQL> select * from test
2 start with day_number=1
3 connect by prior day_number=day_number-1 and prior msisdn= msisdn
4 ;

BILL_MONTH DAY_NUMBER MSISDN
-------------------- ---------- --------------------
200803 1 13800
200803 2 13800
200803 3 13800

上面的语句查找出了从1开始,并且day_number 逐渐+1 递增的,并且 msisdn 相同的哪些个数据.

❷ sql如何将一条内容包含空格的记录拆分成多条记录

“张三,李四,王五,钱六,赵七,Tom,Amy,Joe,Leo”,现在要将此字符串按照“,”进行分离得到一组数据,现在可以得出这个函数传入变量有两个,一个是目标字符串,我们定义为@string,数据类型为nvarchar(500),选择nvarchar()是为了兼顾所有Unicode字符集,比如中文;另一个变量为分隔符,我们定义为@separator,数据类型为nvarchar(10),输出变量则定义为@array,一个单列列名为String,数据类型为nvarchar(500)的Table。

以字符串“张三,李四,王五,钱六,赵七,Tom,Amy,Joe,Leo”为例,首先得找到第一个“,”,然后把“张三”截取出来,然后将目标字符串变成“李四,王五,钱六,赵七,Tom,Amy,Joe,Leo”,然后再找第一个“,”,把“李四”截取出来,依次类推,直到找不到“,”,有了这个思路,下面就直接实现,查找字符串在程序语言中一般用indexOf方法,截取一般用Substring方法,SQL SERVER中有SUBSTRING函数用来截取字符串,但是没有indexOf查找函数,取而代之的是CHARINDEX和PATINDEX函数,CHARINDEX用于完全匹配查找,而PATINDEX用于模糊匹配查找,根据我们的需求,选用CHARINDEX函数,整个SPLIT函数代码如下:

CREATEFUNCTION[dbo].[SPLIT]
(
--
@stringnvarchar(500),
@separatornvarchar(10)
)
RETURNS@arrayTABLE(Stringnvarchar(500))
AS
BEGIN
--Declarethereturnvariablehere
DECLARE@separatorIndexint,@tempStringnvarchar(500),@tagStringnvarchar(500)
--AddtheT-
SET@tagString=@string
SET@separatorIndex=CHARINDEX(@separator,@tagString)
WHILE(@separatorIndex<>0)
BEGIN
SET@tempString=SUBSTRING(@tagString,1,@separatorIndex-1)
INSERTINTO@array(String)VALUES(@tempString)
SET@tagString=SUBSTRING(@tagString,@separatorIndex+1,LEN(@tagString)-@separatorIndex)
SET@separatorIndex=CHARINDEX(@separator,@tagString)
END
SET@tempString=@tagString
IF(LEN(@tempString)>0)
INSERTINTO@array(String)VALUES(@tagString)
--Returntheresultofthefunction
RETURN
END
GO

测试

SELECT*FROMdbo.SPLIT(N'张三,李四,王五,钱六,赵七,Tom,Amy,Joe,Leo',',')

❸ sql一条数据拆分成多条数据,急求!

如不美观是4个字段select id,cord2 from ttunion allunion allselect id,cord3 from ttunion allselect id,cord4 from ttselect id,cord1 from tt

❹ sql 如何将一条记录查成多条

sqlserver写法

创建测试表

createtablet
(col1varchar(10),
col2numeric(10,1),
col3varchar(10),
col4int)

insertintotvalues('山东',0.8,'全部',7)

执行

selectt.*fromt,
(selectnumberfrommaster..spt_valueswherenumberbetween1and(selectmax(col4)fromt)andtype='P')t2

结果


其他数据库可能写法不同

❺ sql一行拆分多行记录

看个例子 改改再用 应该没问题
QL> select * from t00;

ID ACHAR
---------- ----------
1 ab,ac,ad
1 cc,cf
2 bb,bc,be

SQL> select * from (select id,regexp_substr(achar,'[^,]+',1,level) achar from t00 connect by level<=length(achar)-length(regexp_replace(achar,',',''))+1) group by id,achar order by id ;

ID ACHAR
---------- --------------------
1 ab
1 ac
1 ad
1 cc
1 cf
2 bb
2 bc
2 be

已选择8行。

❻ SQL Server怎么把一条记录按自然月分成多条记录

DECLARE@Room	INT,
@Category NCHAR(50),
@Price DECIMAL(10,2),
@StartDate DATE,
@EndDate DATE,
@Index INT,
@TotalDayDiff INT,
@CurrentMonthStart DATE,
@CurrentMonthEnd DATE

DECLARE@TestTABLE
(
ID INTIDENTITY(1,1),
Room INT,
Category NCHAR(50),
Price DECIMAL(10,2),
StartDate DATE,
EndDate DATE
)
INSERT@TestSELECT1905,N'房租',3000,'2015-02-06','2015-04-05'
UNIONSELECT2000,N'你欠的',5555,'2014-04-20','2015-02-07'
SELECT*FROM@Test

DECLARE@Test2TABLE
(
CurrentMonth CHAR(7),
Room INT,
Category NCHAR(50),
Price VARCHAR(50)
)

SET@Index=1
WHILE@Index<=(SELECTMAX(ID)FROM@Test)
BEGIN
SELECT@Room=Room,@Category=Category,@Price=Price,@StartDate=StartDate,@EndDate=EndDate
FROM@Test
WHEREID=@Index

SELECT@TotalDayDiff=DATEDIFF(DAY,@StartDate,@EndDate)+1
WHILE@StartDate<=@EndDate
BEGIN
SET@CurrentMonthStart=@StartDate
IFYEAR(@StartDate)=YEAR(@EndDate)ANDMONTH(@StartDate)=MONTH(@EndDate)
BEGIN
SET@CurrentMonthEnd=@EndDate
END
ELSE
BEGIN
SET@CurrentMonthEnd=DATEADD(ms,-3,DATEADD(mm,DATEDIFF(m,0,@StartDate)+1,0))
END

INSERT@Test2VALUES(
CAST(YEAR(@CurrentMonthStart)ASVARCHAR)+''+CAST(MONTH(@CurrentMonthStart)ASVARCHAR),
@Room,
@Category,
CAST(@PriceASVARCHAR)+'*'+CAST(DATEDIFF(DD,@CurrentMonthStart,@CurrentMonthEnd)+1ASVARCHAR)+'/'+CAST(@TotalDayDiffASVARCHAR))
SET@StartDate=DATEADD(MM,1,DATEADD(mm,DATEDIFF(mm,0,@StartDate),0))
END

SET@Index=@Index+1
END
SELECT*FROM@Test2

写得这么多这么辛苦才5分。。。。。

❼ Oracle通过一个字段的值将一条记录拆分为多条记录

本文个人拙见,若有出入,请指出——来自菜的颤抖
该方式的效率不高,如何优化,请看 记Oracle中regexp_substr函数的一次调优(速度提高99.5%)

表A中存放了集装箱的信息,一个集装箱一条记录,表B中存放了对于集装箱操作的指令,一条指令包括多个集装箱箱号,通过分号 ; 切割( TCIU2347687;XUTR3546865 ),现在的需求是,对于已经在指令表B中的集装箱,在查询表A时需要过滤掉。

所以必须将分号分割的记录,拆分成单独的记录。

变成:

Oracle可使用 regexp_substr函数 实现,实现上面切割的sql为:

其中 regexp_substr 各个参数的含义:

结果就是 aaa , 如果把第二个1变成2,输出就是 bbb 。
好了,这部分意图很明显了,下面就是把它每一个切割串取出来,看到上面取 level个 ,而这个 level 是个什么东西呢,在这个之前,先看 regexp_count(string, c) 函数,这个函数其实很好理解,返回string中c的个数。
然后就是这个level,这是一个伪列,和RowNum相似,

所以再回到最初的sql,也就很好理解了。

❽ sql一条数据拆分成多条

select 编号,买方姓名,'' as 卖方姓名,产品名称
from Tab
union all
select 编号,'' as 买方姓名,卖方姓名,产品名称
from Tab

❾ sql查询将一条数据分成多条

select 用户NO,部门1 from table1 where 用户NO='001' union all

select 用户NO,部门2 from table1where 用户NO='001' union all
select 用户NO,部门3 where 用户NO='001'

❿ SQL一行数据拆分成多行

select Name1 Spec1 Qty1 from A
union
select Name2 Spec2 Qty2 from A
union
select Name3 Spec3 Qty3 from A