2015-06-26 1 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, в противном случае, группа по виджете может варьировать ла 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

wow ... извините ... я даю u решение для 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

 Смежные вопросы

  • Нет связанных вопросов^_^