2015-06-26 38 views
1

我有一個表,看起來像這樣:如何將不同的字段值轉換爲SQLite中的列?

WidgetName | LanguageId | Text 
-------------------------------- 
lbNext  | 1031  | weiter 
lbNext  | 1033  | next 
btConnect | 1031  | verbinden 
btConnect | 1033  | connect 

不同LanguageIds的數量變化爲新的翻譯(和新的語言)可以添加。我想從這張桌子上得到的是另一張表格,我們可以給我們的翻譯。它應該有這樣的結構:

WidgetName | 1031  | 1033 | [...other LanguageIds] 
---------------------------------------------------------- 
lbNext  | weiter | next | [...other translations] 
btConnect | verbinden | connect | [...other translations] 

有沒有辦法像SQL查詢這樣的表?我想這個問題可能是不同數量不同的語言......

+0

這是可能的,但是,不同的將採取不論widgetname的,否則,通過控件組可以改變LA nguageId。 –

回答

1

在這裏,你是你所需要的完整的查詢(我用TABLE_1作爲表名,它很容易替換)

您需要使用PIVOT在一個取巧的辦法:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(LanguageId) 
        from Table_1 
        group by LanguageId 
        order by LanguageId 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 
select @cols 


set @query = N'SELECT widgetName, ' + @cols + N' from 
      (
       select widgetName, Text, LanguageId 
       from Table_1 
      ) x 
      pivot 
      (
       max(Text) 
       for LanguageId in (' + @cols + N') 
      ) p ' 

exec sp_executesql @query; 
+0

感謝您的回答!不幸的是,它似乎不適用於SQLite。 – Robert

+0

哇......對不起......我給你一個SQL Server的解決方案...... :( – Tirma

0

你可以做同樣這種方式也: -

Set Nocount On; 

Declare @LanguageId  Int 
     ,@Sql1    Varchar(Max) 
     ,@SqlCols   Varchar(Max) 
     ,@SqlUpdates  Varchar(Max) 

If Object_Id('tempdb.dbo.#WidgetLanguage') Is Not Null Drop Table #WidgetLanguage; 

If Object_Id('tempdb.dbo.#Widgets') Is Not Null Drop Table #Widgets; 

Create Table #WidgetLanguage 
(
    WidgetName   Varchar(100) 
    ,LanguageId   Int 
    ,Text    Varchar(100) 
) 

Create Table #Widgets 
(
    WidgetName   Varchar(100) 
) 

Insert Into #WidgetLanguage(WidgetName,LanguageId,Text) Values 
('lbNext',1031,'weiter') 
,('lbNext',1033,'next') 
,('btConnect',1031,'verbinden') 
,('btConnect',1033,'connect') 

Select @LanguageId = Min(wl.LanguageId) 
     ,@Sql1 = '' 
     ,@SqlCols = '' 
     ,@SqlUpdates = '' 
From #WidgetLanguage As wl With (Nolock) 

Insert Into #Widgets(WidgetName) 
Select Distinct 
     wl.WidgetName 
From #WidgetLanguage As wl With (Nolock) 

;With AllLanguages As 
( 
    Select @LanguageId As LanguageId 

    Union All 

    Select Top 1 wl.LanguageId 
    From (
       Select Distinct 
         LanguageId 
       From #WidgetLanguage As wl With (Nolock) 
      ) As wl 
    Where wl.LanguageId > @LanguageId 
) 

Select @Sql1 = @Sql1 + '[' + Cast(al.LanguageId As Varchar(20)) + '],' 
     ,@SqlCols = @SqlCols + ',[' + Cast(al.LanguageId As Varchar(20)) + '] Varchar(100)' 
     ,@SqlUpdates = @SqlUpdates + ',w.[' + Cast(al.LanguageId As Varchar(20)) + '] = Isnull(t.[' + Cast(al.LanguageId As Varchar(20)) + '],'''')' 
From AllLanguages As al With (Nolock) 


Select @Sql1 = Substring(@Sql1, 0, Len(@Sql1)) 
     ,@SqlCols = 'Alter Table #Widgets Add ' + Substring(@SqlCols, 2, (Len(@SqlCols) + 1)) 
     ,@SqlUpdates = Substring(@SqlUpdates, 2, (Len(@SqlUpdates) + 1)) 

Exec (@SqlCols) 

Select @Sql1 = 'Update w Set ' + @SqlUpdates + 
       'From #Widgets As w ' + 
         'Join ' + 
         '(' + 
          'Select WidgetName,' + @Sql1 + ' From ' + 
           '(' + 
            'Select wl.WidgetName,wl.Text,wl.LanguageId '+ 
            'From #WidgetLanguage As wl With (Nolock) '+ 
           ') As wl Pivot(Max(wl.Text) For wl.LanguageId In (' + @Sql1 + ')) t' + 
         ') As t On w.WidgetName = t.WidgetName ' 

----Print (@Sql1) 
Exec (@Sql1) 


Select * 
From #Widgets As wl With (Nolock) 
+0

對不起,但DECLARE不支持SQLite。 – Robert

相關問題