2015-02-05 3 views
0

У меня есть SQL-представление, созданное уже &, которое показывает определенные столбцы из таблицы базы данных Data. Теперь я хочу изменить это представление таким образом, что ему не нужно добавлять какие-либо дополнительные столбцы в результат. & должен точно совпадать с тем же результатом, что и предыдущее представление. Единственная модификация, которую я хочу здесь: есть столбец с именем PayDate, который занимает от Data. Мне нужна эта колонка, чтобы иметь значение в зависимости от другого столбца с именем OrderType. Таблица Data выглядит следующим образом:Нужна помощь в изменении SQL-представления

Book OrderType PayDate  ValuDate 
------------------------------------------- 
FFF  CA   21/05/2015 NULL 
BBB  CO   NULL   2/02/2014 
EEE  IO   NULL   3/2/2014 
QQQ  Dividend 02/02/2014 NULL 

В настоящее время вид дает OrderType & Paydate в результате. Twist здесь, для OrderType = 'CA' OR 'Dvidend' у нас есть PayDate. Для OrderType = 'CO' OR 'IO' у нас есть ValuDate. Каждый раз для «CO» или «IO» полученное значение равно NULL. Поэтому здесь я хочу CASE, который проверит, будет ли OrderType 'CO' ИЛИ ​​'IO', он вернет ValuDate в столбец PayDate. А в местах, где OrderType - это «CA» или «Dividend», укажите значение PayDate от Data Таблица в PayDate Столбец зрения.

PS: Не хочу добавлять колонку ValuDate здесь. Все, что нам нужно просто поставить значение ValueDate в PayDate колонке зрения, если OrderType является «CO» или «IO'`

IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[ABC]')) 
BEGIN 
    DROP VIEW [dbo].[ABC] 
    PRINT '<<< DROPPED VIEW [dbo].[ABC] >>>' 
END 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE VIEW [dbo].[ABC] 
AS 

    SELECT ISNULL(Book, '') + '_' + ISNULL(OrderType,'') + '_' 
      + ISNULL(CONVERT(VARCHAR(8), PayDate, 112), '') + '_' 
      MAX(t.[InstrumentKey]) [InstrumentKey] , 
      MAX(t.[BookKey]) [BookKey] , 
      t.[OrderType], 
      MAX(t.[InstrumentID]) [InstrumentID] , 
      t.PayDate , 
      FROM dbo.Data t (NOLOCK) 
    LEFT OUTER JOIN dbo.ExtInstrument i ON t.InstrumentKey = i.InstrumentKey 

    WHERE [STATUS] = 'LIVE' 

    GROUP BY Book , 
      OrderType , 
      PayDate , 
      BackToBackBook 


GO 
PRINT '<<< CREATED VIEW [dbo].[ABC] >>>' 

GRANT SELECT ON dbo.ABC TO INVENTORY_READERS 
GO 

PRINT '<<< GRANT SELECT ON VIEW [dbo].[ABC] TO INVENTORY_READERS >>>' 
GO 
+0

В чем проблема? Вы получаете сообщение об ошибке при добавлении CASE? Что такое текст ошибки и как вы изменили представление? –

+0

Можем ли мы это сделать с помощью UNION? –

ответ

1

Пытаясь следовать тому, что вы просите. Это то, что вы имеете в виду?

CREATE VIEW [dbo].[ABC] 
AS 

SELECT ISNULL(Book, '') + '_' + ISNULL(OrderType,'') + '_' 
     + ISNULL(CONVERT(VARCHAR(8), PayDate, 112), '') + '_' 
     MAX(t.[InstrumentKey]) [InstrumentKey] , 
     MAX(t.[BookKey]) [BookKey] , 
     t.[OrderType], 
     MAX(t.[InstrumentID]) [InstrumentID] , 
     CASE WHEN OrderType in ('CO','IO') THEN t.ValuDate ELSE t.PayDate END AS PayDate, 
     FROM dbo.Data t (NOLOCK) 
LEFT OUTER JOIN dbo.ExtInstrument i ON t.InstrumentKey = i.InstrumentKey 

WHERE [STATUS] = 'LIVE' 

GROUP BY Book , 
     OrderType , 
     CASE WHEN OrderType in ('CO','IO') THEN t.ValuDate ELSE t.PayDate END , 
     BackToBackBook 

EDIT: Я подозреваю, что первая часть должна быть

SELECT ISNULL(Book, '') + '_' + ISNULL(OrderType,'') + '_' 
     + ISNULL(CONVERT(VARCHAR(8), CASE WHEN OrderType in ('CO','IO') THEN t.ValuDate ELSE t.PayDate END, 112), '') + '_' 
0

Это то, что я сделал. Но я хочу использовать 'UNION' & получить вид измененный. Можем ли мы использовать UNION в любом случае, чтобы изменить это мнение?

IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[ABC]')) 
BEGIN 
    DROP VIEW [dbo].[ABC] 
    PRINT '<<< DROPPED VIEW [dbo].[ABC] >>>' 
END 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE VIEW [dbo].[ABC] 
AS 


SELECT ISNULL(Book, '') + '_' + ISNULL(OrderType,'') + '_' 
     + ISNULL(t.RIC, '') + '_' 
     + CASE OrderType 
          WHEN OrderType = 'PNoteCorporateAction' OR 'PNoteDividendDraft' OR 'PNoteDividend' THEN ISNULL(CONVERT(VARCHAR(8), PayDate, 112), '') 
      ELSE ISNULL(CONVERT(VARCHAR(8), ValuDate, 112), '') 
      END AS PayDate + '_' 
     MAX(t.[InstrumentKey]) [InstrumentKey] , 
     MAX(t.[BookKey]) [BookKey] , 
     t.[OrderType], 
     MAX(t.[InstrumentID]) [InstrumentID] , 
     t.PayDate , 
     FROM dbo.Data t (NOLOCK) 
LEFT OUTER JOIN dbo.ExtInstrument i ON t.InstrumentKey = i.InstrumentKey 

WHERE [STATUS] = 'LIVE' 

GROUP BY Book , 
     OrderType , 
     CASE WHEN OrderType = 'PNoteCorporateAction' OR 'PNoteDividendDraft' OR 'PNoteDividend' THEN PayDate ELSE ValueDate END AS PayDate, 
     BackToBackBook 


GO 
PRINT '<<< CREATED VIEW [dbo].[ABC] >>>' 

GRANT SELECT ON dbo.ABC TO INVENTORY_READERS 
GO 

PRINT '<<< GRANT SELECT ON VIEW [dbo].[ABC] TO INVENTORY_READERS >>>' 
GO 
+0

Используйте UNION что-то вроде: Выберите PK ...., VALUEDATE * FROM WHERE CO/IO ....... Группа UNION Выберите PK ...., PAYDATE * FROM .... ГДЕ НЕ CO/IO. ...... Группа К –

+0

Почему вы хотите использовать UNION? Да. Кажется, у вас есть правильная идея с вашим предыдущим комментарием. – Elliveny

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