2015-10-15 2 views
1
CREATE VIEW dbo.myview1 As 
SELECT 
a.Id , 
a.Name , 
a.Age , 
CASE 
WHEN b.PmtSched ='Monthly'  THEN 12 
WHEN b.PmtSched ='Quarterly' THEN 4 
WHEN b.PmtSched ='Semi-Annual' THEN 2 
WHEN b.PmtSched ='Annually'  THEN 1 
ELSE 12 
END AS ABC, 
SUM(a.Amount) *50 as TotalAmount , 
(a.AmtSpent - TotalAmount) * ABC as TOTALSPENDS 

FROM dbo.User a join dbo.Details b on a.Id = b.Id 

Здесь ABC и TotalAmount являются столбцами Alias, которые необходимо использовать при вычислении в поле зрения, и я не могу их использовать. Как это сделать? Есть ли способ, которым мы могли бы это сделать, или мы не можем?Может ли столбец псевдонимов использоваться для просмотра в другом столбце?

+3

Нет, этого не может быть. Вместо этого вы можете использовать подзапрос или CTE. Это относится ко всем базам данных. –

ответ

1

Да, вы можете использовать его и вам не нужно ни подзапросов, ни, CTE. Это просто CROSS APPLY. Это довольно элегантно и не ухудшает читаемость. Если вам нужна дополнительная информация, прочитайте here.

Пожалуйста, смотрите этот пример:

CREATE VIEW dbo.myview1 
AS 
SELECT A.Id 
    , A.Name 
    , A.Age 
    , SUM(A.Amount) * 50 AS TotalAmount 
    , (A.AmtSpent - TotalAmount) * T.ABC AS TotalSpends 
FROM dbo.[User] AS A 
CROSS APPLY (
    SELECT CASE B.PmtSched 
      WHEN 'Monthly' THEN 12 
      WHEN 'Quarterly' THEN 4 
      WHEN 'Semi-Annual' THEN 2 
      WHEN 'Annually' THEN 1 
      ELSE 12 
     END) AS T(ABC) 
INNER JOIN dbo.Details AS B 
    ON A.Id = B.Id; 
+1

Зависит от вашей перспективы, я полагаю. Что бы вы описали содержимое круглых скобок после 'APPLY' как, если не подзапрос? –

+0

Думаю, это вопрос перспективы и аргумента. Quick Googling сообщает мне, что * Эти подзапросы могут находиться в предложении WHERE, в предложении FROM или в предложении SELECT *. Я основывал свой вопрос на этом. Но хорошее место. Спасибо. [Источник] (http://www.techonthenet.com/sql_server/subqueries.php) –

+0

Это помогло. Спасибо @Evaldas Buinauskas – sujai

5

Простым решением проблемы является повторение выражения, использование подзапроса или использование CTE.

Однако более интеллектуальный метод заключается в добавлении справочной таблицы для графиков платежей. Это будет выглядеть так:

create table PaymentSchedules (
    PaymentScheduleId int identity(1, 1) primary key, 
    ScheduleName varchar(255), 
    FrequencyPerYear float -- this could be less often than once per year 
); 

Тогда вид будет выглядеть так:

CREATE VIEW dbo.myview1 As 
    SELECT a.Id, a.Name, a.Age, ps.FrequencyPerYear, 
      SUM(a.Amount) * 50 as TotalAmount, 
      (a.AmtSpent - SUM(a.Amount) * 50) * ps.FrequencyPerYear as TOTALSPENDS 
    FROM dbo.User a join 
     dbo.Details b 
     on a.Id = b.Id join 
     dbo.PaymentSchedules ps 
     on ps.PaymentScheduleId = a.PamentScheduleId; 
1

Простой ответ "НЕТ"

Это невозможно сделать это без subquery.

или

Вы должны использовать CTE

Ниже запроса поможет вам получить то, что вам нужно.

;WITH Amount 
(
SELECT a.Id,a.NAME,a.Age,a.AmtSpent, 
      CASE WHEN b.PmtSched ='Monthly'  THEN 12 
       WHEN b.PmtSched ='Quarterly' THEN 4 
       WHEN b.PmtSched ='Semi-Annual' THEN 2 
       WHEN b.PmtSched ='Annually'  THEN 1 
      ELSE 12 
      END AS ABC 
      ,SUM(a.Amount) * 50 AS TotalAmount 
    FROM 
     dbo.[User] a 
    INNER JOIN 
     dbo.Details b ON a.Id = b.Id 
    GROUP BY id, NAME, age, abc, a.AmtSpent, TotalAmount 
) 

Теперь вы можете называть эти псевдонимы для расчета.

SELECT id,NAME,age,abc,(a.AmtSpent - TotalAmount) * ABC AS TOTALSPENDS FROM Amount