У меня есть таблица 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
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
Я недостаточно хорошо знаю специфику таблиц, чтобы сделать запрос, но лучшие варианты для вас:
- Используйте выражение общей таблицы вместо представления, чтобы получить набор данных, а затем выполните необходимые запросы для отчета по этим данным. Пожалуйста, см. [Microsoft's Technet] (Используйте общее табличное выражение вместо представления, чтобы получить набор данных и затем выполнить) для примеров. На мой взгляд, это был бы предпочтительный метод, потому что он (немного) отделяет бизнес-логику от данных.
ИЛИ
- Управляйте информацией с помощью операторов case в зависимости от дня недели записи. Это похоже на ответ, который рекомендовал Шон.
Сообщите мне более подробную информацию, и я готов помочь вам составить запрос.
Похожие вопросы
Новые вопросы
sql-server
Microsoft SQL Server — это система управления реляционными базами данных (RDBMS). Используйте этот тег для всех выпусков Microsoft SQL Server, включая Compact, Express, Azure, Fast-track, APS (ранее PDW) и Azure SQL DW. Не используйте этот тег для других типов СУБД (MySQL, PostgreSQL, Oracle и т. д.). Не используйте этот тег для вопросов по программному обеспечению и разработке мобильных устройств, если только он не связан напрямую с базой данных.