2010-03-08 5 views
1

Мне нужно выполнить обновление/вставку, одновременно меняя структуру входящих данных.Нужна помощь в преобразовании структуры таблицы SQL

Подумайте о магазинах, которые определили рабочее время для каждого дня недели.

Будем надеяться, что это могло бы объяснить лучше, что я пытаюсь достичь:

worktimeOrigin стол:

колонны:

  • shop_id
  • день
  • вал

данные:

shop_id | day  | val 
------------------------------ 
123  | "monday" | "9:00 AM - 18:00" 
123  | "tuesday" | "9:00 AM - 18:00" 
123  | "wednesday" | "9:00 AM - 18:00" 

магазин стол:

колонны:

  • ID
  • worktimeDestination.id

worktimeDestination стол:

колонки:

  • ID
  • Понедельник
  • вторник
  • среда

Моя цель:

Я хотел бы, чтобы вставить данные из таблицы в worktimeOrigin worktimeDestination и указать соответствующий worktimeDestination для магазина.

магазин таблица данных:

  • 1 (обновлено)

worktimeDestination таблица данных:

id | monday   | tuesday   | wednesday 
--------------------------------------------------------------------------- 
1 | "9:00 AM - 18:00" | "9:00 AM - 18:00" | "9:00 AM - 18:00" (inserted) 

Любые идеи, как это сделать?

+0

@Arnis, не могли бы вы указать, какую версию SQL Server вы используете. –

+0

@Aaron Mssql2008. –

+0

лучше использовать столбцы DATETIME: start & end, а не 'day' и' val' –

ответ

2

Вы можете использовать PIVOT, например.

;WITH x AS 
(
    SELECT 
     ShopID, 
     [Monday] = [2], 
     [Tuesday] = [3], 
     [Wednesday] = [4] 
    FROM 
    (
     SELECT 
      ShopID, 
      DW = CASE [Day] 
       WHEN 'Monday' THEN 2 
       WHEN 'Tuesday' THEN 3 
       WHEN 'Wednesday' THEN 4 
      END, 
      val 
     FROM 
      dbo.WorkTimeOrigin 
     -- WHERE ShopID = 123 or @param 
    ) AS d 
    PIVOT 
    (
     MAX(val) 
     FOR DW IN ([2],[3],[4]) 
    ) AS p 
) 
/* 
INSERT dbo.WorkTimeDestination 
(
    id, 
    Monday, 
    Tuesday, 
    Wednesday 
) 
*/ 
SELECT 
    s.[WorkTimeDestination.ID], 
    [Monday], 
    [Tuesday], 
    [Wednesday] 
FROM x 
INNER JOIN dbo.Shop AS s 
ON x.ShopID = s.id; 

Раскомментировать часть INSERT, когда вас устраивают результаты. Обратите внимание, что не все три строки обязательно будут существовать, поэтому вы можете получить NULL для одного или нескольких значений.

+0

Выглядит многообещающе. Попробует. –

+0

Вы спасатель жизни! :) –

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