Нужна помощь с запросом SQL, который объединяет соседние строки в одну строку - PullRequest
0 голосов
/ 15 июля 2009

Мне нужно решение проблемы, которая имеет структуру таблицы, как указано ниже. Ввод

1 01.01.2009 Product1
2 02.02.2009 Product2
3 3/3/2009 Product3
4 04.04.2009 Product4
5 5/5/2009 Product5

выход

1 01.01.2009 2/2009 Product1
2 3/3/2009 04.04.2009 Product3
3 5/5/2009 Product5

Я пытался использовать CTE. Но было не очень удачно извлечь значение второй строки. Ценю любую помощь. Спасибо.

Ответы [ 3 ]

1 голос
/ 15 июля 2009

Не знаю, поможет ли вам ответ Русса. Вот ссылка на статью, которая объясняет, как добавить номера строк к результатам запроса. (Найдите «row_number», чтобы найти наиболее вероятный пример.)

После того, как у вас будет запрос с нумерацией строк, вы сможете добавить его в CTE, затем выбрать его дважды - один раз для нечетных чисел, затем снова для четных чисел. Пусть каждый результат возвращает четное значение для объединения (нечетное - 1 = четное). На этом этапе вы можете объединить результаты запросов и получить два продукта в одной строке.

1 голос
/ 15 июля 2009

Вы ищете PIVOT: http://msdn.microsoft.com/en-us/library/ms177410.aspx
Вот лучший снимок с информацией, которую вы дали, я делаю нечто подобное в одном из моих приложений. Вам может понадобиться использовать динамический SQL-запрос, если изменяются значения сводки.

SELECT *
    FROM (SELECT [Date]
        ,[Product] 
      FROM [Values]
   PIVOT (Max([Date])
          FOR [Product]
           IN ('put date ranges here')) pvt

вот то, на что похожа моя шахта, это позволит установить множество различных значений. Это используется в конструкторе форм для получения значений пользовательского ввода

--//Get a comma delimited list of field names from the field table for this form
DECLARE @FieldNames varchar(max)
SELECT @FieldNames = COALESCE(@FieldNames + ', ', '') + '[' + CAST([FieldName] AS varchar(max)) + ']'
  FROM [Fields]
 WHERE [FormID] = @FormID

--//create a dynamic sql pivot table that will bring our 
--//fields and values together to look like a real sql table
DECLARE @SQL varchar(max)
SET @SQL = 
 'SELECT *
    FROM (SELECT [Values].[RowID]
            ,[Fields].[FieldName]
            ,[Values].[Value] 
            FROM [Values]
      INNER JOIN [Fields] ON [Fields].[FieldID] = [Values].[FieldID]
           WHERE [Fields].[FormID] = ''' + @FormID + ''') p
   PIVOT (Max([Value])
      FOR [FieldName]
      IN (' + @FieldNames + ')) pvt'

--//execute our sql to return the data
EXEC(@SQL)
0 голосов
/ 15 марта 2019

Вы можете изначально создать фиктивный столбец и создать cte.

Затем используйте cte и соедините их на фиктивной клавише и номере строки или серии, которая имитирует последовательные числа.

Затем отфильтруйте набор данных, чтобы отобразить только нечетные строки

create table dbo.test
(
    id integer,
    currdate varchar(20), -- just to keep simple, not to mess with dates, took this as string
    productCode varchar(20)
);


insert into test values (1, '1/1/2009', 'product1');
insert into test values (2, '2/2/2009', 'product2');
insert into test values (3, '3/3/2009', 'product3');
insert into test values (4, '4/4/2009', 'product4');
insert into test values (5, '5/5/2009', 'product5');


with ctes as
(
    select
        't' as joinKey,
        id, -- serves as rownum or else create another using row_num() over partition by and order by
        currdate,
        productCode     
    from test
)
select
    c1.id,
    c1.currdate,
    c1.productCode,
    c2.id,
    c2.currdate,
    c2.productCode
from
(
    select
        joinKey,
        id,
        currdate,
        productCode
    from
        ctes
)c1,
(
    select
        joinKey,
        id,
        currdate,
        productCode
    from
        ctes
)c2
where c1.joinKey = c2.joinKey
and c1.id + 1 = c2.id
and c1.id % 2 = 1

Результат показан ниже:

id  currdate    productCode id  currdate    productCode
1   1/1/2009    product1    2   2/2/2009    product2
3   3/3/2009    product3    4   4/4/2009    product4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...