2012-04-12 129 views
3

對不起,如果標題不好。但我不知道如何解決這個問題。 我一直在努力與sql中的查詢。我不知道這個問題是否曾被問過。但我需要得到第一列不是空的。我有這樣一個表:如何獲得非空的第一列

ID 0  1  2  3  4  5  6  7  8  9  
59 NULL NULL NULL NULL NULL NULL NULL NULL NULL text1 
185 NULL NULL NULL NULL NULL text1 text2 text3 text4 text5 
428 NULL NULL NULL NULL NULL NULL text1 text2 text3 text4 
53 NULL NULL NULL NULL NULL NULL NULL NULL text1 text2 
452 NULL NULL NULL NULL NULL NULL NULL NULL NULL text1 
267 text1 text2 text3 text4 text5 text6 text7 text8 text9 text10 

而且我想輸出是這樣的:

ID 0  1  2  3  4  5  6  7  8  9  
59 text1 NULL NULL NULL NULL NULL NULL NULL NULL NULL 
185 text1 text2 text3 text4 text5 NULL NULL NULL NULL NULL 
428 text1 text2 text3 text4 NULL NULL NULL NULL NULL NULL 
53 text1 text2 NULL NULL NULL NULL NULL NULL NULL NULL 
452 text1 NULL NULL NULL NULL NULL NULL NULL NULL NULL 
267 text1 text2 text3 text4 text5 text6 text7 text8 text9 text10 

ID列是每行唯一的。

我的失敗嘗試是創建一個scalared函數併爲每列運行它。功能如下:

CREATE FUNCTION GetCulumnsThatIsNotNull 
(
    @column1 VARCHAR(500), 
    @column2 VARCHAR(500), 
    @column3 VARCHAR(500), 
    @column4 VARCHAR(500), 
    @column5 VARCHAR(500), 
    @column6 VARCHAR(500), 
    @column7 VARCHAR(500), 
    @column8 VARCHAR(500), 
    @column9 VARCHAR(500), 
    @column10 VARCHAR(500) 
) 
RETURNS VARCHAR(500) 
AS 
BEGIN 
RETURN 
    COALESCE(@column1, 
    COALESCE(@column2, 
    COALESCE(@column3, 
    COALESCE(@column4, 
    COALESCE(@column5, 
    COALESCE(@column6, 
    COALESCE(@column8, 
    COALESCE(@column9, 
    COALESCE(@column10,null))))))))) 
END 

但有了這個功能的問題是,它只是挑選那些null第一列。所以結果是這樣的:

ID 0  1  2  3  4  5  6  7  8  9  
59 text1 text1 text1 text1 text1 text1 text1 text1 text1 text1 
185 text1 text1 text1 text1 text1 text1 text1 text1 text1 text1 
428 text1 text1 text1 text1 text1 text1 text1 text1 text1 text1 
53 text1 text1 text1 text1 text1 text1 text1 text1 text1 text1 
452 text1 text1 text1 text1 text1 text1 text1 text1 text1 text1 
267 text1 text1 text1 text1 text1 text1 text1 text1 text1 text1 

有什麼建議嗎?

編輯

這將無法正常工作醚。

COALESCE(pvt.[0], 
pvt.[1], 
pvt.[2], 
pvt.[3], 
pvt.[4], 
pvt.[5], 
pvt.[6], 
pvt.[7], 
pvt.[8], 
pvt.[9]) 

因爲它會導致相同的輸出

+0

採取這裏http://msdn.microsoft.com/en-us/library/ms190349.aspx看看第一個例子似乎是你想要的。 – 2012-04-12 13:24:15

+0

已更新問題 – Arion 2012-04-12 13:31:13

+9

**這是錯誤數據結構的指示**如果您的數據元素表示它們看起來是一樣的東西(即0-9都表示類似的東西),則應將其歸一化,這種情況下,像這樣的查詢將是非常微不足道的。 – JNK 2012-04-12 13:31:16

回答

3

我會正常化在視圖中或CTE或東西的數據,然後運行一個普通的樞軸。這樣,如果你實際上規範了表格,你就可以重用代碼。

-- Setup test data 
declare @texts table (
     ID int not null primary key 
    , Col0 varchar(10) null 
    , Col1 varchar(10) null 
    , Col2 varchar(10) null 
    , Col3 varchar(10) null 
    , Col4 varchar(10) null 
    , Col5 varchar(10) null 
    , Col6 varchar(10) null 
    , Col7 varchar(10) null 
    , Col8 varchar(10) null 
    , Col9 varchar(10) null 
) 
insert into @texts select 59, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'text1' 
insert into @texts select 185, NULL, NULL, NULL, NULL, NULL, 'text1', 'text2', 'text3', 'text4', 'text5' 
insert into @texts select 428, NULL, NULL, NULL, NULL, NULL, NULL, 'text1', 'text2', 'text3', 'text4' 
insert into @texts select 53, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'text1', 'text2' 
insert into @texts select 452, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'text1' 
insert into @texts select 267, 'text1', 'text2', 'text3', 'text4', 'text5', 'text6', 'text7', 'text8', 'text9', 'text10' 

-- Normalize and get new column in a CTE 
;with cte as (
    select * 
     , row_number() over (partition by ID order by Col) - 1 as NewCol 
    from (
     select ID, 0 as Col 
      , (select Col0 from @texts where ID = a.ID) as Val 
     from @texts a 
     union all 
     select ID, 1 as Col 
      , (select Col1 from @texts where ID = a.ID) as Val 
     from @texts a 
     union all 
     select ID, 2 as Col 
      , (select Col2 from @texts where ID = a.ID) as Val 
     from @texts a 
     union all 
     select ID, 3 as Col 
      , (select Col3 from @texts where ID = a.ID) as Val 
     from @texts a 
     union all 
     select ID, 4 as Col 
      , (select Col4 from @texts where ID = a.ID) as Val 
     from @texts a 
     union all 
     select ID, 5 as Col 
      , (select Col5 from @texts where ID = a.ID) as Val 
     from @texts a 
     union all 
     select ID, 6 as Col 
      , (select Col6 from @texts where ID = a.ID) as Val 
     from @texts a 
     union all 
     select ID, 7 as Col 
      , (select Col7 from @texts where ID = a.ID) as Val 
     from @texts a 
     union all 
     select ID, 8 as Col 
      , (select Col8 from @texts where ID = a.ID) as Val 
     from @texts a 
     union all 
     select ID, 9 as Col 
      , (select Col9 from @texts where ID = a.ID) as Val 
     from @texts a 
    ) as b 
    where b.Val is not null 
) 
-- Run a pivot of the CTE 
select ID 
    , (select Val from cte where ID = a.ID and NewCol = 0) as Col0 
    , (select Val from cte where ID = a.ID and NewCol = 1) as Col1 
    , (select Val from cte where ID = a.ID and NewCol = 2) as Col2 
    , (select Val from cte where ID = a.ID and NewCol = 3) as Col3 
    , (select Val from cte where ID = a.ID and NewCol = 4) as Col4 
    , (select Val from cte where ID = a.ID and NewCol = 5) as Col5 
    , (select Val from cte where ID = a.ID and NewCol = 6) as Col6 
    , (select Val from cte where ID = a.ID and NewCol = 7) as Col7 
    , (select Val from cte where ID = a.ID and NewCol = 8) as Col8 
    , (select Val from cte where ID = a.ID and NewCol = 9) as Col9 
from cte a 
group by ID 
order by ID 
2
select * 
from 
    (
    select T.ID, C.C, row_number() over(partition by T.ID order by C.N) - 1 as rn 
    from @T as T 
     cross apply (values (C0, 0),(C1, 1),(C2, 2),(C3, 3),(C4, 4), 
          (C5, 5),(C6, 6),(C7, 7),(C8, 8),(C9, 9)) as C(C, N) 
    where C.C is not null 
) as T 
pivot 
    (
    min(C) for rn in ([0],[1],[2],[3],[4],[5],[6],[7],[8],[9]) 
) as P 

嘗試在SE-Data

+0

使用'values'在SQL Server 2008上工作。在SQL Server 2005中替換爲'select C0,0 union all select C1,1 ....'。 – 2012-04-12 16:36:11

+0

+1表示數據鏈接 - 很好。 – Geoff 2012-04-12 19:16:49