當前位置:首頁 » 編程語言 » 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