iT邦幫忙

0

最近在練習SQL同欄位轉明細的練習,但現況有個資料庫確讓我無解了。需請各位高手協助該如何下這樣子的語法

說明:上方四列,是資料庫當中有的資料且為同一個資料表,但是現況需匯入至練檔中
需要將上方四列的資料拆成如下的明細,且尺寸 及 庫存數的顯示方式都不相同,那麼
Script如何下,才能變成下方的明細。謝謝

商品型號 商品名稱 尺寸1 尺寸2 尺寸3 尺寸4 尺寸5 尺寸6
90001 GORUN 1 0 0 3 7 4
90002 GORUN 2 20 5 0 7 0
90003 GORUN2 2 0 4 0 7 0
90004 GORUN2 3 4 5 0 6 4

商品型號 商品名稱 尺寸 庫存數
90001 GORUN 1 1
90001 GORUN 4 3
90001 GORUN 5 7
90001 GORUN 6 4
90002 GORUN 1 2
90002 GORUN 2 29
90002 GORUN 3 5
90002 GORUN 5 7
90003 GORUN2 1 2
90003 GORUN2 3 4
90003 GORUN2 5 7
90004 GORUN2 1 3
90004 GORUN2 2 4
90004 GORUN2 3 5
90004 GORUN2 5 6
90004 GORUN2 6 4

看更多先前的討論...收起先前的討論...
用中文當欄位名稱,大概是SQL Server
這種方式叫做Unpivot
看以下鏈結,有unpivot()函數可以用.
http://blog.devart.com/is-unpivot-the-best-way-for-converting-columns-into-rows.html
allenlwh iT邦研究生 4 級 ‧ 2015-11-19 11:10:02 檢舉
如果u_source的資料有到尺寸100的話,把@最大尺寸設定為=100,就可以直接執行,不用再改其它東西了。
小雨大最近比較忙哦
以前都會直接寫完整答案的
偷笑
手頭上沒有SQL Server....汗
8
純真的人
iT邦高手 1 級 ‧ 2015-11-19 09:59:00
最佳解答

給你個提示

請用善用Union方式~

外獅佬 iT邦大師 1 級 ‧ 2015-11-19 10:15:16 檢舉

union +1

<pre class="c" name="code">
SELECT [商品型號],[商品名稱],'1' AS [尺寸],[尺寸1] AS [庫存] FROM [Table_1]
UNION
SELECT [商品型號],[商品名稱],'2' AS [尺寸],[尺寸2] AS [庫存] FROM [Table_1]
UNION
SELECT [商品型號],[商品名稱],'3' AS [尺寸],[尺寸3] AS [庫存] FROM [Table_1]
UNION
SELECT [商品型號],[商品名稱],'4' AS [尺寸],[尺寸4] AS [庫存] FROM [Table_1]
UNION
SELECT [商品型號],[商品名稱],'5' AS [尺寸],[尺寸5] AS [庫存] FROM [Table_1]
UNION
SELECT [商品型號],[商品名稱],'6' AS [尺寸],[尺寸6] AS [庫存] FROM [Table_1]
外獅佬 iT邦大師 1 級 ‧ 2015-11-19 10:16:27 檢舉

要避開null或者庫存為0,每個select子句加上where條件就好了

simon0627 iT邦新手 2 級 ‧ 2015-11-20 10:50:25 檢舉

已測試 唯若尺寸若遠大於6 可能非常麻煩

WilliamHuang
iT邦研究生 1 級 ‧ 2015-11-19 09:46:17
【**此則訊息已被站方移除**】
2
allenlwh
iT邦研究生 4 級 ‧ 2015-11-19 11:14:07

如果u_source的資料有到尺寸100的話,把@最大尺寸設定為100,這個script就可以直接執行,不用再改其它地方。

<pre class="c" name="code">declare @sql nvarchar(max)

declare @目前尺寸 int
declare @最大尺寸 int

set @sql=''
set @目前尺寸=1
set @最大尺寸=6

while @目前尺寸<=@最大尺寸
begin
	set @sql='insert into u_target (商品型號,商品名稱,尺寸,數量) '
	set @sql=@sql+'select 商品型號,商品名稱,'''+CONVERT(varchar(2),@目前尺寸)+''',尺寸'+CONVERT(varchar(2),@目前尺寸)+' from u_source where 尺寸'+CONVERT(varchar(2),@目前尺寸)+'>0'
	
	EXECUTE sp_executesql @sql
	set @目前尺寸=@目前尺寸+1
end
simon0627 iT邦新手 2 級 ‧ 2015-11-20 11:07:02 檢舉

若只改 u_source 大該也動不了吧 沒有u_target table ,而u_source 欄位 名稱未必一樣所以動不了 .... 當然依範例所提供的table 名稱 是可以執行的 感謝你分享了一種新的方式

2
rodchi
iT邦新手 5 級 ‧ 2015-11-20 09:32:33

這問題看起來應該是一個要求用pivot的(作業?)

看更多先前的回應...收起先前的回應...
ander6879 iT邦新手 5 級 ‧ 2015-11-20 10:41:20 檢舉

謝謝各位提供的各式方法,小弟這邊都練過一次了,現在題問又加深難度了,現況練習過程小卡,debug中,現況是如下的情況。

原題如下:
商品型號 商品名稱 尺寸1 尺寸2 尺寸3 尺寸4 尺寸5 尺寸6

加重題型如下:假設多了一個TABLE,SIZE,存放可能多達10種以上的尺寸
及商品庫存名細中再插入一個欄位SIZE,那該如何再把明細的值給
拉出來。
我這邊一定是用基本的UNINO 及 INNER JOIN 再配合 WHERE多條件去判斷
,但拉出來就是錯,還是說我方向是錯的,這裡使用『CASE』會比較好??

SIZE:裡面有 SIZE 尺寸1 尺寸2 尺寸3 尺寸4 尺寸5 尺寸6
A 2 3 4 5 6 7
B 2.5 3.5 4.5 5.5 6.5 7.5
C S M XL XXL
商品型號 商品名稱 SIZE 尺寸1 尺寸2 尺寸3 尺寸4 尺寸5 尺寸6
A 尺寸值1 尺寸值2 尺寸值3 尺寸值4 尺寸值5 尺寸值6
B 尺寸值2 尺寸值3 尺寸值4 尺寸值5 尺寸值6 尺寸值7

simon0627 iT邦新手 2 級 ‧ 2015-11-20 11:18:38 檢舉

ander6879提到:
品庫存名細中再

看不太懂你的加重,若你還想加入其它table 建議以allenlwh 產生了新的table 在去join 你的size table 應該就可以了

simon0627 iT邦新手 2 級 ‧ 2015-11-20 11:23:35 檢舉

pivot 感謝又學到新東西 目前到是沒想到如何運用在此例子上

說實在的.....題目歸題目的設計...

實際上沒有人會將資料這麼紀錄...完全沒邏輯的存資料...

ander6879 iT邦新手 5 級 ‧ 2015-11-24 10:11:52 檢舉

謝謝各位:最終是要面對一個最難的題型了。
==>如圖中的上方資料表欄位,需拆成下方資料明細。該如何下語法。
先前忘了有上傳圖檔這個功能,導至問題混淆。故貼圖上傳

ander6879 iT邦新手 5 級 ‧ 2015-11-24 10:12:29 檢舉

ander6879 iT邦新手 5 級 ‧ 2015-11-24 16:00:07 檢舉

各位好:小弟已將此類型的語法給解決完成了。感恩~~~

rodchi iT邦新手 5 級 ‧ 2015-11-25 09:51:21 檢舉

jer5173 說:
說實在的.....題目歸題目的設計...

實際上沒有人會將資料這麼紀錄...完全沒邏輯的存資料...
2015-11-20 17

的確實務上是不會有這種設計方式,但是確有可能因為特殊的報表需求,
會有類似這樣的轉換輸出.

我要發表回答

立即登入回答