Как сводить мои данные с помощью SQL Server 2005

У меня есть следующие данные

Как сводить мои данные с помощью SQL Server 2005

Как мне преобразовать его (с SQL Server 2005) в следующий формат?

Как сводить мои данные с помощью SQL Server 2005

У меня есть пример решения, который я придумал, но он кажется немного неуклюжим. Может, пахнет?

DECLARE @ProductLanguage TABLE
(
    [PRODUCT_ID] int
    , [LANGUAGE] varchar(50)
)

INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (52035,'Czech')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (52035,'English')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (52035,'German')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (54001,'Danish')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (54001,'Spanish')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (54001,'English')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (70501,'Finnish')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (70501,'Greek')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (70501,'Hungarian')
INSERT INTO @ProductLanguage ([PRODUCT_ID],[LANGUAGE]) VALUES (52044,'Hebrew')

SELECT
    PRODUCT_ID
    ,MAX(CASE WHEN [ROW_ID]=1 THEN LANGUAGE ELSE NULL END) As LANG_1
    ,MAX(CASE WHEN [ROW_ID]=2 THEN LANGUAGE ELSE NULL END) As LANG_2
    ,MAX(CASE WHEN [ROW_ID]=3 THEN LANGUAGE ELSE NULL END) As LANG_3
FROM
    (SELECT
        ROW_NUMBER() OVER (PARTITION BY [PRODUCT_ID] ORDER BY [PRODUCT_ID] ASC) AS [ROW_ID]
        , [PRODUCT_ID]
        , [LANGUAGE]
    FROM
        @ProductLanguage) AS Temp
GROUP BY
    [PRODUCT_ID]

Интересно то, что меня не волнуют конкретные языки, отображаемые в каждом столбце LANG_ *. Другие вопросы, размещенные здесь, похоже, относятся к известному названию сводных столбцов. Но я не хочу называть столбцы найденными языками.

ПРИМЕЧАНИЕ: Я знаю, что упоминаю слово «поворот», но лучшее решение этой проблемы может не включать предложение PIVOT. Я просто использовал это слово, поскольку мой вопрос, казалось, предлагал сводные данные. Может быть, CTE поможет с решением, не знаю. Я просто знаю, что мне не нравится приведенный выше пример решения.

у тебя есть ответ? если о, пожалуйста, поделитесь с нами

Raj 02.07.2010 09:59
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
1
1 385
4

Ответы 4

Вот идея ... Используйте ключевое слово Pivot ... доступное в sql2005

Pivot и UnPivot

Затем, после того, как вы выполните эту работу, выводя имена столбцов в виде значений данных, вставьте весь этот sql statemnt как подзапрос во внешний оператор Select, где вы задаете псевдонимы имен столбцов как «Language1», «Language2» и т. д.

Select Z.Arabic as Language1, Z.Botwanese as Language2, etc.
From  (Inner Pivot Query Here ) Z

Извините, но мне трудно понять, как использовать PIVOT для получения этих столбцов, поскольку в этом случае столбцы не привязаны к конкретному языку.

BlackMael 19.12.2008 06:07

Вы можете использовать функцию PIVOT ()

SELECT    P.PRODUCT_ID,
          P.Czech,
          P.Other languages
FROM      TABLE AS T
PIVOT     (
              AGGREGATE(LANGUAGE) FOR LANGUAGE IN ([Czech],  ...)
          ) AS P

Если вы не называете столбцы явно, вы, насколько я знаю, вынуждены делать трюки ...

Не проверено (очевидно). Видеть: MSDN

Похоже, что это касается определенного языка. Я хочу LANG_1, LANG_2, LANG_3. В какой столбец попадает язык, не имеет значения.

BlackMael 19.12.2008 06:10

Это можно сделать с помощью PIVOT статически или динамически.

В статической версии столбцы жестко запрограммированы (см. SQL Fiddle с демонстрацией):

select *
from 
(
  select product_id, language,
    'Lang_' + cast(row_number() over(partition by PRODUCT_ID order by language) as varchar(10)) rn
  from ProductLanguage
) x
pivot
(
  max(language)
  for rn in ([Lang_1], [Lang_2], [Lang_3])
) p

Динамическая версия получит столбцы во время выполнения (см. SQL Fiddle с демонстрацией):

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Lang_' + cast(row_number() over(partition by PRODUCT_ID order by language) as varchar(10))) 
                    from ProductLanguage
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT PRODUCT_ID, ' + @cols + ' from 
             (
              select product_id, language,
                ''Lang_'' + cast(row_number() over(partition by PRODUCT_ID order by language) as varchar(10)) rn
              from ProductLanguage
            ) x
            pivot 
            (
                max(language)
                for rn in (' + @cols + ')
            ) p '

execute(@query)
create table  #ProductLanguage 
(
    PRODUCT_ID int
    , [LANGUAGE] varchar(50)
)

INSERT INTO #ProductLanguage  ([PRODUCT_ID],[LANGUAGE]) VALUES (52035,'Czech')
INSERT INTO #ProductLanguage  ([PRODUCT_ID],[LANGUAGE]) VALUES (52035,'English')
INSERT INTO #ProductLanguage  ([PRODUCT_ID],[LANGUAGE]) VALUES (52035,'German')
INSERT INTO #ProductLanguage  ([PRODUCT_ID],[LANGUAGE]) VALUES (54001,'Danish')
INSERT INTO #ProductLanguage  ([PRODUCT_ID],[LANGUAGE]) VALUES (54001,'Spanish')
INSERT INTO #ProductLanguage  ([PRODUCT_ID],[LANGUAGE]) VALUES (54001,'English')
INSERT INTO #ProductLanguage  ([PRODUCT_ID],[LANGUAGE]) VALUES (70501,'Finnish')
INSERT INTO #ProductLanguage  ([PRODUCT_ID],[LANGUAGE]) VALUES (70501,'Greek')
INSERT INTO #ProductLanguage  ([PRODUCT_ID],[LANGUAGE]) VALUES (70501,'Hungarian')
INSERT INTO #ProductLanguage  ([PRODUCT_ID],[LANGUAGE]) VALUES (52044,'Hebrew')


declare @col as varchar(2000)
declare @query as varchar(4000)

--select language ,@col= replace('[Lang_'+str(row_number() over(order by language))+']',' ','') Lang  from (select distinct language  from #ProductLanguage)p
select  @col = stuff((select distinct '],['+language  from #ProductLanguage for xml path('')),1,2,'')+']' 
print @col

set @query = 'select PRODUCT_ID, '+@col+ ' from #ProductLanguage 
pivot (
max(LANGUAGE) for LANGUAGE in ('+@col+')
) pvt'
execute(@query)

Что ж, это меняет результаты, но не так, как того хотела ОП.

Andriy M 26.09.2013 22:18

Другие вопросы по теме