Как создать вычисляемый столбец в таблице SQL Server 2008 - PullRequest
5 голосов
/ 04 января 2012

Мне действительно нужен вычисляемый столбец в таблице с простой суммой.

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

SELECT   key3
         ,SUM(UTOTALWBUD)
FROM     CONTACT1
         INNER JOIN CONTACT2
            ON CONTACT1.ACCOUNTNO = CONTACT2.ACCOUNTNO
WHERE    KEY1 = 'Client'
GROUP BY KEY3

Я попытался создать вычисляемый столбец, добавив следующее

ALTER TABLE ManagerTaLog
ADD         WeeklyBudget as (   SELECT
                                        key3
                                        ,SUM(UTOTALWBUD)
                            FROM        CONTACT1
                                        JOIN CONTACT2
                                            ON CONTACT1.ACCOUNTNO = CONTACT2.ACCOUNTNO
                            WHERE       KEY1 = 'Client'
                            GROUP BY    KEY3)

Я получил сообщение об ошибке:

Сообщение 1046, Уровень 15, Состояние 1, Строка 4
Подзапросы не допускаются в этом контексте. Допускаются только скалярные выражения.

Пожалуйста, сообщите, что я могу с этим сделать.

Большое спасибо

часть 2

Я создал функцию; Тем не менее, я получаю нулевые значения, пожалуйста, сообщите.

CREATE FUNCTION [dbo].[SumIt](@Key3 varchar)
RETURNS TABLE 
AS
RETURN
(
SELECT      SUM(UTOTALWBUD)
FROM        CONTACT1
            JOIN CONTACT2
                ON CONTACT1.ACCOUNTNO = CONTACT2.ACCOUNTNO
            JOIN Phone_List
                ON CONTACT1.KEY3 = Phone_List.[Manager ]
WHERE       KEY1 = 'Client'
            AND Phone_List.[Manager ] = @Key3
GROUP BY [Manager ]

)
END

GO

Просто выберите оценку, которая возвращает значения, которые я хочу добавить в таблицу Phone_list

SELECT      [Manager ]
            ,SUM(UTOTALWBUD)
FROM        CONTACT1
            JOIN CONTACT2
                ON CONTACT1.ACCOUNTNO = CONTACT2.ACCOUNTNO
            JOIN Phone_List
                ON CONTACT1.KEY3 = Phone_List.[Manager ]
WHERE       KEY1 = 'Client'
GROUP BY    [Manager ]

Таблица определений

CREATE TABLE [dbo].[CONTACT1](
    [ACCOUNTNO] [varchar](20) NOT NULL,
    [COMPANY] [varchar](40) NULL,
    [CONTACT] [varchar](40) NULL,
    [LASTNAME] [varchar](15) NULL,
    [DEPARTMENT] [varchar](35) NULL,
    [TITLE] [varchar](35) NULL,
    [SECR] [varchar](20) NULL,
    [PHONE1] [varchar](25) NOT NULL,
    [PHONE2] [varchar](25) NULL,
    [PHONE3] [varchar](25) NULL,
    [FAX] [varchar](25) NULL,
    [EXT1] [varchar](6) NULL,
    [EXT2] [varchar](6) NULL,
    [EXT3] [varchar](6) NULL,
    [EXT4] [varchar](6) NULL,
    [ADDRESS1] [varchar](40) NULL,
    [ADDRESS2] [varchar](40) NULL,
    [ADDRESS3] [varchar](40) NULL,
    [CITY] [varchar](30) NULL,
    [STATE] [varchar](20) NULL,
    [ZIP] [varchar](10) NOT NULL,
    [COUNTRY] [varchar](20) NULL,
    [DEAR] [varchar](20) NULL,
    [SOURCE] [varchar](20) NULL,
    [KEY1] [varchar](20) NULL,
    [KEY2] [varchar](20) NULL,
    [KEY3] [varchar](20) NULL,
    [KEY4] [varchar](20) NULL,
    [KEY5] [varchar](20) NULL,
    [STATUS] [varchar](3) NOT NULL,
    [NOTES] [text] NULL,
    [MERGECODES] [varchar](20) NULL,
    [CREATEBY] [varchar](8) NULL,
    [CREATEON] [datetime] NULL,
    [CREATEAT] [varchar](5) NULL,
    [OWNER] [varchar](8) NOT NULL,
    [LASTUSER] [varchar](8) NULL,
    [LASTDATE] [datetime] NULL,
    [LASTTIME] [varchar](5) NULL,
    [U_COMPANY] [varchar](40) NOT NULL,
    [U_CONTACT] [varchar](40) NOT NULL,
    [U_LASTNAME] [varchar](15) NOT NULL,
    [U_CITY] [varchar](30) NOT NULL,
    [U_STATE] [varchar](20) NOT NULL,
    [U_COUNTRY] [varchar](20) NOT NULL,
    [U_KEY1] [varchar](20) NOT NULL,
    [U_KEY2] [varchar](20) NOT NULL,
    [U_KEY3] [varchar](20) NOT NULL,
    [U_KEY4] [varchar](20) NOT NULL,
    [U_KEY5] [varchar](20) NOT NULL,
    [recid] [varchar](15) NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO



CREATE TABLE [dbo].[Phone_List](
    [Manager ] [nvarchar](255) NULL,
    [SalesCode] [nvarchar](255) NULL,
    [Email] [nvarchar](255) NULL,
    [PayrollCode] [nvarchar](255) NULL,
    [Mobile] [nvarchar](255) NULL,
    [FName] [nchar](20) NULL,
    [idd] [tinyint] NULL,
    [OD] [varchar](20) NULL,
    [WeeklyBudget]  AS ([dbo].[SumIt]([manager]))
) ON [PRIMARY]

Ответы [ 6 ]

8 голосов
/ 04 января 2012

Вы можете заключить ваш запрос в функцию следующим образом (это HAS для возврата одного значения):

CREATE FUNCTION dbo.SumIt(@Key1 varchar(max))
returns float
as
begin
  return (select sum(UTOTALWBUD) from
   CONTACT1 inner join
   CONTACT2 on
   CONTACT1.ACCOUNTNO=CONTACT2.ACCOUNTNO
   where KEY1=@key1
   group by KEY3)
END

И использовать эту функцию вместо поля calc - что-то вроде этого:

alter table ManagerTaLog add WeeklyBudget as dbo.SumIt(Key1)

ПРИМЕЧАНИЕ

, что это повлияет на производительность для таких запросов:

select * from ManagerTaLog 

Вы должны изменить свою функцию таким образомКстати, это значение NOT varchar, но NVARCHAR(255) - того же типа, что и в столбце Manager.Попробуй.

1 голос
/ 09 января 2012

ИМХО Это неправильный путь. Вы должны использовать триггер в таблицах CONTACT и обновлять WeeklyBudget в этих триггерах.

1 голос
/ 04 января 2012

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

Вы можете иметь выражение, которое возвращает одиночное значение - или вы можете заключить свой код в сохраненную функцию - или вы можете создать представление (с помощью JOIN или подзапроса), которое объединяет эту логику в нечто Вы можете использовать

1 голос
/ 04 января 2012

Если вы решите проблему возврата двух значений, одним из решений будет реализация вычисления в функции и использование этой функции для вычисляемого столбца.

Некоторые соображения

  • Я предположил, что это Key3, который должен быть передан в функцию, и добавил условие where для возврата еженедельного бюджета для данного значения Key3.
  • Функция будет выполняться для каждой записи в наборе результатов, в который вы добавляете вычисляемый столбец.

Сценарий

CREATE FUNCTION dbo.fn_ManagerTaLogWeeklyBudget(@Key3 INTEGER) RETURNS INTEGER AS 
BEGIN
  select sum(UTOTALWBUD) from
  CONTACT1 inner join
  CONTACT2 on
  CONTACT1.ACCOUNTNO=CONTACT2.ACCOUNTNO
  where KEY1='Client'
        AND KEY3 = @Key3
  group by KEY3)

END
GO

ALTER TABLE dbo.ManagerTaLog
ADD WeeklyBudget AS dbo.fn_ManagerTaLogWeeklyBudget(Key3)
0 голосов
/ 03 ноября 2015
CREATE FUNCTION [dbo].[SumIt](@Key3 varchar)
RETURNS TABLE 
AS
RETURN
(
SELECT      SUM(ISNULL(UTOTALWBUD,0))
FROM        CONTACT1
            JOIN CONTACT2
                ON CONTACT1.ACCOUNTNO = CONTACT2.ACCOUNTNO
            JOIN Phone_List
                ON CONTACT1.KEY3 = Phone_List.[Manager ]
WHERE       KEY1 = 'Client'
            AND Phone_List.[Manager ] = @Key3
GROUP BY [Manager ]

)
END

GO

Надеюсь, это поможет.Обратите внимание, что это не правильное решение, но это может помочь вашему конкретному сценарию.Поскольку функция возвращает несколько значений, вы можете либо использовать табличную функцию, либо просто изменить запрос таким образом, чтобы он возвращал только одно значение.Но если столбец обнуляем, пожалуйста, не забудьте добавить ISNULL.

0 голосов
/ 05 января 2012

Вы можете иметь вычисляемые столбцы в таблице, но они будут присутствовать (и рассчитываться) во всех строках таблицы.То, что вы пытаетесь сделать в своем выборе, называется " aggregate ".Попробуйте это:

select key3, sum(UTOTALWBUD) as WeeklyBudget from
CONTACT1 inner join CONTACT2 on CONTACT1.ACCOUNTNO=CONTACT2.ACCOUNTNO
where KEY1='Client' 
group by key3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...