2012-01-30 71 views
1

我希望有人能夠幫助我處理我一直在寫的查詢。我對sql仍然很陌生,所以如果我錯誤地解釋了一些東西,請告訴我。需要幫助將填充數據移至空白字段的字段

我有一個帶零件號字段的表格,30個描述字段和30個描述值字段。我試圖以特定的格式返回記錄,其中沒有填充字段前的空白值的記錄。舉例來說,如果我有以下記錄:

Part_Number|Description_1|Description_1_Value|Description_2|Description_2_Value|Description_3|Description_3_Value 
123|Color|Red|Material|Wood|Quantity| 
456|Color||Material|Steel|Quantity| 
789|Color|Black|Material||Quantity|1 

我想返回以下結果:

Part_Number|Description 1|Description 2 
123|Quantity 
456|Color|Quantity 
789|Material 

這裏是我使用的查詢:

SELECT [Part_Number] 
,isnull(case when [Description_1_Value] is null then [Description_1] else '' end,'') 'Description 1' 
,isnull(case when [Description_2_Value] is null then [Description_2] else '' end,'') 'Description 2' 
,isnull(case when [Description_3_Value] is null then [Description_3] else '' end,'') 'Description 3' 
FROM [MyTable] 

問題我對這個查詢的理解是,它允許填充字段之間的空白字段。將所有填充字段移到所有空白字段左側的最佳方法是什麼?我有30列可能或可能沒有數據。

預先感謝您!

編輯:我使用的MS SQL Server Management Studio中2008

+1

SQL Server,MySQL,Sybase,Oracle? – 2012-01-30 13:36:41

+0

我正在使用MS SQL Server管理工作室2008 – user955289 2012-01-30 13:42:59

+1

檢查我的完整示例:)希望它有幫助 – 2012-01-30 13:46:21

回答

2

結果集不匹配列labels.Unless你希望他們成爲'缺少描述1'或類似的東西。例如:第3行,材料不是說明1,但您已將其放在該列中。

如果您想將它們分開,您希望將所有值保留在同一列中,並將值與管道字符連接。

SELECT [Part_Number] 
    ,isnull(case when [Description_1_Value] is null 
       then [Description_1] + '|' 
       else '' 
      end 
     ,'') 
    + isnull(case when [Description_2_Value] is null 
        then [Description_2] + '|' 
        else '' 
       end,'') 
    + isnull(case when [Description_3_Value] is null 
        then [Description_3] + '|' 
        else '' 
       end,'') as 'Missing Description' 
FROM [MyTable] 

您可能要考慮重新設計此表。爲什麼你不能有列:'顏色','數量','材料'?或者有一個名爲Descritions的單獨表格:列:Part_Number,Description_Label,Description_Value。如果您的目標只是獲取缺失值列表,您可以:

Select * from Descriptions Where Description_Value Is Null; 
+0

我認爲你的第一個查詢將適用於我。我無法控制表格的設計,並且此表格中目前有1600種描述組合。還有一個問題......是否有辦法消除最後的「|」如果之後沒有數據呢? – user955289 2012-01-30 14:04:44

2

插入一個臨時表中的值。

更新行以解決您的空白問題。

這是一個完整的例子(我會在插入臨時表#表2的價值觀和aftwerwords我會更新所有行):

create table #test (
id int, 
desc1 int null, 
desc2 int null, 
desc3 int null 
) 

create table #test2 (
id int, 
desc1 varchar(10) null, 
desc2 varchar(10) null, 
desc3 varchar(10) null 
) 


insert into #test values (123, 1, 1, NULL), (456, NULL, NULL, 1), (789, 1, NULL, 1) 


insert into #test2 
select id, 'desc1', null, null from #test 
where desc1 is null 

insert into #test2 
select id, null, 'desc2', null from #test 
where desc2 is null 

insert into #test2 
select id, null, null, 'desc3' from #test 
where desc3 is null 


update #test2 
set desc1 = isnull(desc2, desc3), 
desc2 = null 
where desc1 is null 

update #test2 
set desc2 = isnull(desc3, null), 
desc3 = null 
where desc2 is null 

select * from #test2 

drop table #test 
drop table #test2 
+0

謝謝你的迴應。我有對此數據庫的只讀訪問權限是否重要?這會阻止我創建臨時表嗎? – user955289 2012-01-30 13:48:55

+1

是的,我認爲是這樣,但是你可以在另一個可以訪問那個數據庫的數據庫中創建嗎? – 2012-01-30 14:07:25

+1

不在此服務器上。我的公司有一個非常嚴格的安全政策。我很欣賞這個建議,但是如果我能在這裏創建數據庫的話,我會記住它。謝謝!! – user955289 2012-01-30 14:12:33