iT邦幫忙

0

table轉置但又要求4筆組成一列

小弟資淺
描述不清楚 重新補齊描述

近日遇到一個很特殊的需求
古老的前人留下了一張資料表 table A (此表本身要INNER JOIN 5張表了)

因為使用一個古老的列印套件 導致需要資料轉置

舉例table A 原本資料如下

欄位:
序號,姓名,編號,欄位1,欄位2,欄位3
資料:
1,小明1,001,資料1-1,資料2-1,欄位3-1
2,小王1,002,資料1-2,資料2-2,欄位3-2
3,小華1,003,資料1-3,資料2-3,欄位3-3
4,小李1,004,資料1-4,資料2-4,欄位3-4
5,小明2,005,資料1-5,資料2-5,欄位3-5
6,小王2,006,資料1-6,資料2-6,欄位3-6
7,小華2,007,資料1-7,資料2-7,欄位3-7
8,小李2,008,資料1-8,資料2-8,欄位3-8
9,小明3,009,資料1-9,資料2-9,欄位3-9
10,小王3,0010,資料1-10,資料2-10,欄位3-10
11,小華3,0011,資料1-11,資料2-11,欄位3-11
12,小李3,0012,資料1-12,資料2-12,欄位3-12
13,小明4,0013,資料1-13,資料2-13,欄位3-13
14,小王4,0014,資料1-14,資料2-14,欄位3-14
15,小華4,0015,資料1-15,資料2-15,欄位3-15
16,小李4,0016,資料1-16,資料2-16,欄位3-16

需要把每4筆資料 組成一 row
新的資料表需求如下

New table A
(將原本的資料表欄位做成4組,並每組給一個編號)
欄位:
序號1,姓名1,編號1,欄位1-1,欄位1-2,欄位1-3,序號,姓名2,編號2,欄位2-1,欄位2-2,欄位2-3,序號3,姓名3,編號3,欄位3-1,欄位3-2,欄位3-3,序號4,姓名4,編號4,欄位4-1,欄位4-2,欄位4-3

(如上述每4筆資料組成一筆新資料,即舊資料4筆變成1row)
資料:
1,小明1,001,資料1-1,資料2-1,欄位3-1,2,小王1,002,資料1-2,資料2-2,欄位3-2,3,小華1,003,資料1-3,資料2-3,欄位3-3,4,小李1,004,資料1-4,資料2-4,欄位3-4

5,小明2,005,資料1-5,資料2-5,欄位3-5,6,小王2,006,資料1-6,資料2-6,欄位3-6,7,小華2,007,資料1-7,資料2-7,欄位3-7,8,小李2,008,資料1-8,資料2-8,欄位3-8

9,小明3,009,資料1-9,資料2-9,欄位3-9,10,小王3,0010,資料1-10,資料2-10,欄位3-10,11,小華3,0011,資料1-11,資料2-11,欄位3-11,12,小李3,0012,資料1-12,資料2-12,欄位3-12

13,小明4,0013,資料1-13,資料2-13,欄位3-13,14,小王4,0014,資料1-14,資料2-14,欄位3-14,15,小華4,0015,資料1-15,資料2-15,欄位3-15,16,小李4,0016,資料1-16,資料2-16,欄位3-16

第一次碰到這種 查不太到相關資料

看更多先前的討論...收起先前的討論...
石頭 iT邦高手 1 級 ‧ 2021-08-05 19:01:50 檢舉
給你一個關鍵字 Dynamic pivot
只要有一定的邏輯,都可以設法處理.但是你描述的,嗯..... 能夠具體一點嗎?
起碼你要把 原本的欄位 , 簡單幾筆資料, 想要達成的樣子,設法描述出來.
不然很難幫你.
要大家各自去通靈,然後還要能對上.相對就減少回答討論的參與了.
描述不清楚 已重新補齊描述
有查過 Dynamic pivot 但結果跟我想要的不太一樣 不是單純轉置 或者是我沒完全理解 Dynamic pivot的用法
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
rogeryao
iT邦超人 8 級 ‧ 2021-08-06 10:12:48
最佳解答
CREATE TABLE A (
Z1 nvarchar(10),
Z2 nvarchar(10),
Z3 nvarchar(10),
Z4 nvarchar(10),
Z5 nvarchar(10),);

INSERT INTO A
VALUES 
('F11','F12','F13','F14','F15'),
('F21','F22','F23','F24','F25'),
('F31','F32','F33','F34','F35'),
('F41','F42','F43','F44','F45'),
('F51','F52','F53','F54','F55'),
('F61','F62','F63','F64','F65'),
('F71','F72','F73','F74','F75'),
('F81','F82','F83','F84','F85'),
('F91','F92','F93','F94','F95'),
('FA1','FA2','FA3','FA4','FA5'),
--
('K11','K12','K13','K14','K15'),
('K21','K22','K23','K24','K25'),
('K31','K32','K33','K34','K35'),
('K41','K42','K43','K44','K45'),
('K51','K52','K53','K54','K55'),
('K61','K62','K63','K64','K65'),
('K71','K72','K73','K74','K75'),
('K81','K82','K83','K84','K85'),
('K91','K92','K93','K94','K95'),
('KA1','KA2','KA3','KA4','KA5'),
--
('M11','M12','M13','M14','M15'),
('M21','M22','M23','M24','M25'),
('M31','M32','M33','M34','M35'),
('M41','M42','M43','M44','M45'),
('M51','M52','M53','M54','M55'),
('M61','M62','M63','M64','M65'),
('M71','M72','M73','M74','M75'),
('M81','M82','M83','M84','M85'),
('M91','M92','M93','M94','M95'),
('MA1','MA2','MA3','MA4','MA5');
WITH CTE_A AS (
SELECT *,
((ROW_NUMBER() OVER (ORDER BY A.Z1) -1) / 4)+1 AS ROWNO_P,
((ROW_NUMBER() OVER (ORDER BY A.Z1) -1) % 4)+1 AS ROWNO_Q
FROM A 
)

SELECT X1.Z1,X1.Z2,X1.Z3,X1.Z4,X1.Z5,
X2.Z1,X2.Z2,X2.Z3,X2.Z4,X2.Z5,
X3.Z1,X3.Z2,X3.Z3,X3.Z4,X3.Z5,
X4.Z1,X4.Z2,X4.Z3,X4.Z4,X4.Z5
FROM CTE_A AS X1
LEFT JOIN CTE_A AS X2 ON X2.ROWNO_P=X1.ROWNO_P AND X2.ROWNO_Q=2
LEFT JOIN CTE_A AS X3 ON X3.ROWNO_P=X1.ROWNO_P AND X3.ROWNO_Q=3
LEFT JOIN CTE_A AS X4 ON X4.ROWNO_P=X1.ROWNO_P AND X4.ROWNO_Q=4
WHERE X1.ROWNO_Q=1
ORDER BY X1.ROWNO_P

Demo

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-08-05 23:16:49

我不知道答案
我只能補充題目
原始資料如下(欄位數=5,原題目是20,自行想像)

F11,F12,F13,F14,F15
F21,F22,F23,F24,F25
F31,F32,F33,F34,F35
F41,F42,F43,F44,F45
F51,F52,F53,F54,F55
F61,F62,F63,F64,F65
F71,F72,F73,F74,F75
F81,F82,F83,F84,F85
F91,F92,F93,F94,F95
FA1,FA2,FA3,FA4,FA5

要的結果如下(4 row 變 1 row)

F11,F12,F13,F14,F15,F21,F22,F23,F24,F25,F31,F32,F33,F34,F35,F41,F42,F43,F44,F45
F51,F52,F53,F54,F55,F61,F62,F63,F64,F65,F71,F72,F73,F74,F75,F81,F82,F83,F84,F85
F91,F92,F93,F94,F95,FA1,FA2,FA3,FA4,FA5

感謝補充 如您說的這樣沒錯

有查過Dynamic SQL PIVOT 看了其他欄位合併的寫法FOR XML PATH 似乎都跟我的需求不太依樣

我要發表回答

立即登入回答