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

Например:

Date, Shift, Running Hours  
7/11/14, 1, 4.2

Моя проблема в том, что в будние дни есть 3 восьмичасовые смены, а в выходные - две двенадцатичасовые смены. Все данные хранятся в 3 смены вне зависимости от дня недели.

Говоря простым языком, по выходным мне нужно взять время работы 2-й смены, разделить его на два и прибавить к времени 1-й и 3-й смены. Кроме того, 1-ю и 3-ю смены в выходные дни необходимо переименовать в 4-ю и 5-ю смены, потому что они не имеют одинаковой продолжительности с рабочими сменами.

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

Является ли использование представления даже правильным методом? Изменит ли обновление представления значения в исходной таблице? Или у меня должна быть другая таблица, заполненная хранимой процедурой, в которой есть все манипуляции?

Спасибо за любую помощь, которую вы можете оказать. И прошу прощения за любые проблемы с форматированием. Это мой первый пост.

SELECT TOP (100) PERCENT 
    ShiftNumber, TowerString, 
    convert(varchar,a.ShiftDateTime,101) AS Day, Running, 
FROM 
    DBName.dbo.ShiftDetails

UPDATE 
    v_ViewName
SET 
    ShiftNumber = 4
WHERE     
    DATENAME(dw, Day) = 'Saturday' AND ShiftNumber = 1
0
d.munky 8 Авг 2014 в 20:10

2 ответа

Лучший ответ

Если я правильно понимаю, вы не обязательно хотите создавать копию, а скорее использовать ее для выполнения необходимых вам манипуляций. Чтобы сделать все это без выполнения манипуляций с исходными данными, вы можете объединить наборы вместе. Объединения позволяют вам разделить вторую смену на 2 половины, назначив их сменам 4 и 5. Группа по будет объединять «2» 4-ю и 5-ю записи вместе, чтобы дать вам общее количество.

   ;WITH ShiftDetail AS (    
    Select ShiftDateTime    
    , Case when DateName(dw,ShiftDateTime) = 'Saturday' and shiftnumber = 1 then 4 when DateName(dw,ShiftDateTime) = 'Saturday' and shiftnumber = 3 then 5 else ShiftNumber end    
    ,Running    
    ,TowerString    
    FROM dbo.ShiftDetails    
    WHERE DateName(dw,ShiftDateTime) <> 'Saturday' OR  ShiftNumber IN (1,3)    
    UNION ALL    
    SELECT ShiftDateTime, 4 as ShiftNumber, Running/2.0 as Running, TowerString    
    FROM dbo.ShiftDetails    
    where DateName(dw,ShiftDateTime) = 'Saturday' and ShiftNumber =2    
    UNION ALL    
    SELECT ShiftDateTime, 5 as ShiftNumber, Running/2.0 as Running, TowerString    
    FROM dbo.ShiftDetails    
    where DateName(dw,ShiftDateTime) = 'Saturday' and ShiftNumber =2
)    
    SELECT ShiftDateTime, ShiftNumber, TowerString, Sum(Running) as Running    
    FROM ShiftDetail    
    GROUP BY ShiftDateTime, ShiftNumber,TowerString
0
Sean 8 Авг 2014 в 17:43

Я недостаточно хорошо знаю специфику таблиц, чтобы сделать запрос, но лучшие варианты для вас:

  • Используйте выражение общей таблицы вместо представления, чтобы получить набор данных, а затем выполните необходимые запросы для отчета по этим данным. Пожалуйста, см. [Microsoft's Technet] (Используйте общее табличное выражение вместо представления, чтобы получить набор данных и затем выполнить) для примеров. На мой взгляд, это был бы предпочтительный метод, потому что он (немного) отделяет бизнес-логику от данных.

ИЛИ

  • Управляйте информацией с помощью операторов case в зависимости от дня недели записи. Это похоже на ответ, который рекомендовал Шон.

Сообщите мне более подробную информацию, и я готов помочь вам составить запрос.

0
abalos 8 Авг 2014 в 18:08