2016-02-22 11 views
1

Я работаю с SQL Server для клиента, и они дали мне запрос.SQL Server длинный столбец на несколько более коротких столбцов

У них есть стол products со многими колоннами, один из которых - article. Есть около 28 000 строк в products.

Они хотят, чтобы создать новую таблицу articles, которая содержит только номера статей из products, но настроить так, чтобы новая таблица занимает article столбец и делит его на 3 колонки каждая с (до) 10000 строк. Я объяснил, что это не лучшее программное обеспечение для этого, но они настаивают (и это те, кто платит мне!). Новая таблица имеет столбцы Article1, Artcile2 и Article3.

Может ли кто-нибудь помочь мне с этим?

Все, что мне удалось до сих пор получает первые цифры 10000 статей правильно используя

insert into articles (Article1) 
    select top 10000 article 
    from products 

Но теперь я застрял о том, как вставить оставшиеся значения в 2-й и 3-й столбцы. Я знаю, что мне действительно нужно, это какой-то вопрос UPDATE, но я никуда не могу.

Я бег SSMS 2014

+0

Данные примера и ожидаемый результат могут помочь. –

+0

Какова цель денормализации данных? Я бы сказал, что исходные данные должны оставаться нормализованными (одна статья за строку), но вы можете создать _view_ поверх данных, если есть настоятельная необходимость иметь три статьи в строке. Следующий аргумент будет: что, если у продукта есть четыре статьи? –

ответ

1

Если я понимаю ваш вопрос правильно, вы хотите преобразовать строки article в таблицу с тремя столбцами. Вот попытка:

;WITH Cte AS(
    SELECT article, 
     grp = (ROW_NUMBER() OVER(ORDER BY article) -1) % 
       (SELECT CEILING(COUNT(*)/(3 * 1.0)) FROM products) 
    FROM products 
), 
CteFinal AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(PARTITION BY grp ORDER BY article) 
    FROM Cte 
) 
INSERT INTO articles(Article1, Article2, Article3) 
SELECT 
    Article1 = MAX(CASE WHEN rn = 1 THEN article END), 
    Article2 = MAX(CASE WHEN rn = 2 THEN article END), 
    Article3 = MAX(CASE WHEN rn = 3 THEN article END) 
FROM CteFinal 
GROUP BY grp 
0

Вы можете использовать НЕ СУЩЕСТВУЕТ положение, как при вставке в articles2 таблице, вы можете проверить его как NOT EXISTS (SELECT article_id из ARTICLES2). Надеюсь, вы поняли мое мнение.

Кроме того, если вы можете изменить структуру основной таблицы ARTICLE, вы можете добавить столбец с именем say PROCESSED (это будет логический столбец со значением по умолчанию 0). После того, как вы вставили данные в таблицу articles1, вы можете обновить столбец PROCESSED для этих статей как 1, затем вы можете обработать оставшиеся статьи (которые обработали значение столбца = 0) для статьи2, а затем обновить те, с обработанными = 1, аналогично для статьи 3. Дайте мне знать, если у вас есть какие-либо вопросы.

+0

Эй, спасибо за быстрый ответ! Да, я понимаю, что вы имеете в виду. Я только что решил это по-другому: я скопировал первые 10 000 строк в таблицу, второй 10 000 в другую и последние 8 000 на треть, и, наконец, обновил столбец таблицы «articles» по столбцу. – nick

0

Использовать идентификатор таблицы products.

WITH NumberedMyTable AS 
(
    SELECT 
     Article, 
     ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber 
    FROM 
     Products 
); 

Insert INTO Articles1 
SELECT 
    Articles 
FROM 
    NumberedMyTable 
WHERE 
    RowNumber BETWEEN @From AND @To 

Просто измените @From и @To за 3 таблицы.

первой таблица: @From = 1, @To = 10000

второй таблица: @From = 10001, @To = 20000

третья таблица: @From = 20001, @To = 28000

0

Ничего себе ... Я люблю слышать о том, как другие знают, как эффективно (не) создать базу данных, например, вы вынуждены. Хотя у вас может быть указанная таблица столбцов 1, 2, 3 и т. Д., И вы знаете, что это не имеет смысла, попробуйте создать таблицу в более эффективном формате. Затем дайте им VIEW, который показывает статьи 1, 2, 3 в формате одной строки, который они хотят.До тех пор, пока это может быть эффективным, возможно, это поможет реализовать вашу ситуацию, но дать им необходимую им информацию?

Что касается этого, и им может потребоваться самое последнее «x» количество статей по сравнению с первым, вы можете добавить столбец в таблицу продуктов, обозначающую последнюю ПОСЛЕДОВАТЕЛЬНОСТЬ СТАТЬИ, используемую для данного продукта. Таким образом, во время вставки в таблицу статей он получает следующий порядковый номер, добавляя 1 из столбца, содержащего продукты. Затем, когда вставка завершена, она обновляет колонку хранения продукта для следующей статьи.

Таким образом, продукт может иметь что-то вроде ...

productid lastArticleSeq 
1   4 
2   23 
3   18 
4   27 
etc... 

И ваша таблица статей может иметь ...

articleid productid articleseq 
1   1   1 
2   4   1 
3   1   2 
4   3   1 
5   4   2 
...etc. 

Таким образом, если бы они были заинтересованы в запросе что последние 3 статьи, вы можете использовать lastArticleSeq и извлечь из этого.