результаты в случае используются в том же запросе - PullRequest
0 голосов
/ 29 ноября 2011

Я пытаюсь сделать что-то похожее на это, но не уверен, как это сделать в SQL-запросе. Сначала я создаю столбец, а затем хочу удалить столбец, поскольку он является вычисляемым столбцом, и меня всегда учили не использовать вычисляемые столбцы в таблице

Alter table baseSupple add Buys int null
GO
select com.YrAmount, Buys = 
case when b.BaseAmount is null
   then com.Amount+ com.BaseAmount+ com.Amount1
   when b.BaseAmount is not null
   then com.Amount+ com.Amount1+ b.BaseAmount 
END, Sum(b.Buys - com.Tng) as Fy11, Sum(b.Buys - com.Tng - com.Tng) as Fy12  from baseSupple as b inner join comSupple as com on com.id = b.id
GO
Alter table baseSupple drop Buys

Я думал, что смогу сделать это с помощью оператора case, но он выдаст мне ошибку, поскольку недопустимое имя столбца не распознается, поскольку оно содержится в том же операторе. Я предполагаю, что если я смогу заставить это работать, я могу скопировать и вставить sql для отчета в файл report.rdl. Я новичок на сервере отчетов sql server, поэтому не уверен, что это правильный подход для генерации такого типа отчетов в sql. серверная студия бизнес-аналитики

Ответы [ 3 ]

1 голос
/ 29 ноября 2011

Поскольку это, кажется, основа для отчета, который вы хотите запустить, я бы, вероятно, создал бы представление вашей базовой таблицы:

-- create a view as the data source for your report
CREATE VIEW dbo.baseSuppleView AS
  -- create a CTE to determine the "Buys" column
  WITH BuysCTE AS
  (
      SELECT 
          com.YrAmount,
          com.Tng,
          Buys = CASE 
                    WHEN b.BaseAmount IS NULL
                       THEN com.Amount + com.BaseAmount + com.Amount1
                    ELSE
                      com.Amount + com.Amount1 + b.BaseAmount 
                 END 
      FROM dbo.baseSupple AS b 
      INNER JOIN dbo.comSupple AS com ON com.id = b.id
  )
  SELECT   -- select from that CTE - now defined, you can use the "Buys" column
      YrAmount, 
      Buys, 
      SUM(Buys - Tng) AS Fy11, 
      SUM(Buys - 2 * Tng) AS Fy12  
  FROM BuysCTE
  GROUP BY YrAmount, Buys  -- when you have SUM(....), you need GROUP BY(....)

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

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

0 голосов
/ 29 ноября 2011

Нет необходимости вносить изменения в DDL, чтобы получить необходимые расчеты.Я думаю, что ниже должно работать.

`SELECT com.YrAmount, 
     CASE when b.BaseAmount is null
        then com.Amount+ com.BaseAmount+ com.Amount1
        when b.BaseAmount is not null
        then com.Amount+ com.Amount1+ b.BaseAmount 
     END as Buys,
     Sum(b.Buys - com.Tng) as Fy11, 
     Sum(b.Buys - com.Tng - com.Tng) as Fy12
FROM baseSupple as b inner join comSupple as com
   on com.id = b.id
GO`

С уважением, Venk

0 голосов
/ 29 ноября 2011

Не знаю, зачем вам нужны таблицы изменения ..

Select yrAmount, SUM(Buys-tng) as FY11, Sum(buys-tng-tng) as FY12
FROM (
select com.YrAmount, 
case when b.BaseAmount is null
  then com.Amount+ com.BaseAmount+ com.Amount1
  when b.BaseAmount is not null
  then com.Amount+ com.Amount1+ b.BaseAmount END as buys
FROM baseSupple b
INNER JOIN comSupple com 
 on com.id = b.id) A

РЕДАКТИРОВАНИЕ: забыл извлечь покупки из подзапроса.

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