2014-11-10 6 views
0

Это мой стол: с этими столбцами:Добавить вычисляемый столбец

 
ShiftId ShiftNum Date ShiftType StartTime EndTime 
1 1 2014-08-07 A 0:00:00 6:00:00 
2 2 2014-08-07 B 6:01:00 18:00:00 
3 3 2014-08-07 A 18:00:01 23:59:00 
4 1 2014-08-08 A 0:00:00 6:00:00 
5 2 2014-08-08 C 6:01:00 18:00:00 
6 3 2014-08-08 B 18:00:01 23:59:00 
7 1 2014-08-09 B 0:00:00 6:00:00 
8 2 2014-08-09 C 6:01:00 18:00:00 
9 3 2014-08-09 B 18:00:01 23:59:00 
10 1 2014-08-10 B 0:00:00 6:00:00 
11 2 2014-08-10 D 6:01:00 18:00:00 
12 3 2014-08-10 C 18:00:01 23:59:00 
13 1 2014-08-11 C 0:00:00 6:00:00 
14 2 2014-08-11 D 6:01:00 18:00:00 
15 3 2014-08-11 C 18:00:01 23:59:00 
16 1 2014-08-12 C 0:00:00 6:00:00 
17 2 2014-08-12 A 6:01:00 18:00:00 
18 3 2014-08-12 D 18:00:01 23:59:00 
19 1 2014-08-13 D 0:00:00 6:00:00 
20 2 2014-08-13 A 6:01:00 18:00:00 
21 3 2014-08-13 D 18:00:01 23:59:00 
22 1 2014-08-14 D 0:00:00 6:00:00 
23 2 2014-08-14 B 6:01:00 18:00:00 

Я хочу добавить столбец «DailyShiftId» в computrd колонке означает, что когда shiftType изменились, то DailyShiftId было увеличено.

 
ShiftId ShiftNum Date ShiftType StartTime EndTime DailyShiftId 
1 1 2014-08-07 A 0:00:00 6:00:00 1 
2 2 2014-08-07 B 6:01:00 18:00:00 2 
3 3 2014-08-07 A 18:00:01 23:59:00 3 
4 1 2014-08-08 A 0:00:00 6:00:00 3 
5 2 2014-08-08 C 6:01:00 18:00:00 4 
6 3 2014-08-08 B 18:00:01 23:59:00 5 
7 1 2014-08-09 B 0:00:00 6:00:00 5 
8 2 2014-08-09 C 6:01:00 18:00:00 6 
9 3 2014-08-09 B 18:00:01 23:59:00 7 
10 1 2014-08-10 B 0:00:00 6:00:00 7 
11 2 2014-08-10 D 6:01:00 18:00:00 8 
12 3 2014-08-10 C 18:00:01 23:59:00 9 
13 1 2014-08-11 C 0:00:00 6:00:00 9 
14 2 2014-08-11 D 6:01:00 18:00:00 10 
15 3 2014-08-11 C 18:00:01 23:59:00 11 
16 1 2014-08-12 C 0:00:00 6:00:00 11 
17 2 2014-08-12 A 6:01:00 18:00:00 12 
18 3 2014-08-12 D 18:00:01 23:59:00 13 
19 1 2014-08-13 D 0:00:00 6:00:00 13 
20 2 2014-08-13 A 6:01:00 18:00:00 14 
21 3 2014-08-13 D 18:00:01 23:59:00 15 
22 1 2014-08-14 D 0:00:00 6:00:00 15 
23 2 2014-08-14 B 6:01:00 18:00:00 16 

как я могу это сделать?

+0

'shiftType changed' ?? при обновлении? –

+0

Какую версию SQL Server вы используете? –

+0

** «сильный текст» ** ... Ваш текст (написание, обложка и т. Д.) Не так уж и силен! – Tanner

ответ

0

Вы можете добавить DailyShiftId в обычной колонке и добавить AFTER UPDATE Trigger на вашем столе:

CREATE TRIGGER TAU_MyTable 
ON MyTable 
AFTER UPDATE 
AS 
BEGIN 

    UPDATE MyTable SET DailyShiftId = DailyShiftId + 1 
    WHERE [INSERTED].ShiftType <> [DELETED].ShiftType 

END 

ИЛИ

Вы можете добавить функцию в базу данных для расчета стоимости нового столбца и использовать, вычисленных Колонка Спецификация, как это сделано здесь:

http://www.c-sharpcorner.com/UploadFile/rohatash/formula-for-computed-column-specification-property-in-sql-se/

+0

Не будет '' UPDATE' каждой строки в таблице? – Jamiec

0

Создание на обновление Trigger

CREATE TRIGGER ViewEmployeeTrigger ON Employee 
INSTEAD OF UPDATE 
AS 
BEGIN 
SET NOCOUNT ON 

UPDATE Employee 
SET DailyShiftId=DailyShiftId+1 
-- what ever your updation logic 
FROM INSERTED I JOIN Employee C ON I.ShiftId= C.ShiftId 


END 
GO 
+0

нет для уточнения. после вставки – user2806174

0

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

DECLARE @Test Table 
(
    ShiftId Integer, 
    ShiftNum Int, 
    Date DATETIME, 
    ShiftType VARCHAR(1) 
) 

INSERT INTO @Test (ShiftId, ShiftNum, Date, ShiftType) 

SELECT 1, 1, '2014-08-07', 'A' UNION ALL 
SELECT 2, 2, '2014-08-07', 'B' UNION ALL 
SELECT 3, 3, '2014-08-07', 'A' UNION ALL 
SELECT 4, 1, '2014-08-08', 'A' UNION ALL 
SELECT 5, 2, '2014-08-08', 'C' UNION ALL 
SELECT 6, 3, '2014-08-08', 'B' UNION ALL 
SELECT 7, 1, '2014-08-09', 'B'   

    SELECT C.ShiftId, C.ShiftNum, C.Date, C.ShiftType , 
     DENSE_RANK() OVER(order by C.DailyShift ASC) AS DailyShift 
    FROM 
    (
     SELECT A.*, 
      CASE WHEN A.ShiftType = B.ShiftType 
       Then ROW_NUMBER() OVER(ORDER BY A.ShiftId ASC) - 1 
       Else ROW_NUMBER() OVER(ORDER BY A.ShiftId ASC) 
      END AS DailyShift 
     FROM @Test AS A LEFT JOIN @Test AS B ON A.ShiftId = B.ShiftId + 1 
    ) AS C 

Использование вычисляемого столбца:

Добавить столбец в таблицу задав функцию (Calculate).

ALTER TABLE dbo.TableName 
    ADD DailyShiftID AS dbo.Calculate(ShiftId, ShiftType) 

CREATE FUNCTION dbo.Calculate(@nShiftId INT, @sShiftType VARCHAR(1)) 
RETURNS INT 
AS 
    BEGIN 
    DECLARE @sPrevShiftType AS VARCHAR(1) 
    DECLARE @nDailyShift AS INT 

    SELECT @sPrevShiftType = ShiftType, @nDailyShift = ISNULL(DailyShiftID, 0) 
    FROM TableName WHERE ShiftId = @nShiftId - 1 

    IF (@sPrevShiftType <> @sShiftType) 
     SET @nDailyShift = @nDailyShift + 1 

     RETURN @nDailyShift   
    END 
+0

У вас есть результат? если да, то отметьте это как ответ. –

+0

спасибо, что ответите. но я хочу добавить этот столбец в свою таблицу в качестве вычисленного столбца. можешь мне помочь? – user2806174

+0

Я обновил ответ. Проверь это. –