Хранимая процедура SQL, столбец, вычисляемый из двух других вычисляемых столбцов

#sql #sql-server #stored-procedures

#sql #sql-сервер #хранимые процедуры

Вопрос:

я хочу вставить column3 значения из column1 column2(they are calculated columns).

 Column3 = Column1*.666 Column2*.3333
  

Column1 и Column2 генерируются из операторов case, и они хороши, но это просто Column3 то, что основано на
Column1 и Column2 . Кто-нибудь может мне помочь, как я могу вычислить Column3 .

Будем признательны за любую помощь.

Заранее спасибо

          INSERT INTO IF_FUNDDETAILS  ( D.FUNDCODE,   D.FUNDNAME,  Column1,Column2, Column3)
            SELECT DISTINCT  D.FUNDCODE, D.FUNDNAME, 
    CASE WHEN  AVG( FD.INDUSTRYCONTRIBUTIONS)>80 THEN '80' ELSE '90' END AS Column1,
    CASE WHEN  AVG( FD.BENEFITSCONTRIBUTIONS)>50 THEN '50' ELSE '90' END AS Column2,
            FROM   DBO.WS_FUNDDETAIL AS D 
            LEFT OUTER JOIN DBO.V_FUNDNOOUTOFPOCKET AS NOP ON D.FUNDDETAILID = NOP.FUNDDETAILID 
            INNER JOIN DBO.WS_FUNDDATA AS FD ON NOP.FUNDREPORTID = FD.FUNDREPORTID 
            GROUP BY  D.FUNDCODE, D.FUNDNAME
  

Комментарии:

1. Попробуйте также добавить эти 2 случая

2. Вы используете MySQL или SQL Server? Кто-то удалил тег MySQL, но, возможно, это неправильно.

Ответ №1:

Вы не можете повторно использовать псевдонимы на том же уровне запроса. Итак, просто повторите CASE выражения:

 INSERT INTO IF_FUNDDETAILS (D.FUNDCODE, D.FUNDNAME, Column1, Column2, Column3)
SELECT DISTINCT
    D.FUNDCODE,
    D.FUNDNAME, 
    CASE WHEN AVG(FD.INDUSTRYCONTRIBUTIONS) > 80 THEN 80 ELSE 90 END AS Column1,
    CASE WHEN AVG(FD.BENEFITSCONTRIBUTIONS) > 50 THEN 50 ELSE 90 END AS Column2,
    0.666 * (CASE WHEN AVG(FD.INDUSTRYCONTRIBUTIONS) > 80 THEN 80 ELSE 90 END)  
    0.333 * (CASE WHEN AVG(FD.BENEFITSCONTRIBUTIONS) > 50 THEN 50 ELSE 90 END) AS Column3
FROM DBO.WS_FUNDDETAIL AS D 
LEFT OUTER JOIN DBO.V_FUNDNOOUTOFPOCKET AS NOP
    ON D.FUNDDETAILID = NOP.FUNDDETAILID 
INNER JOIN DBO.WS_FUNDDATA AS FD
    ON NOP.FUNDREPORTID = FD.FUNDREPORTID 
GROUP BY D.FUNDCODE,
         D.FUNDNAME
  

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

Ответ №2:

Вы можете сделать это с помощью CTE.

 ;with cte
AS
(
SELECT DISTINCT  D.FUNDCODE, D.FUNDNAME, 
    CASE WHEN  AVG( FD.INDUSTRYCONTRIBUTIONS)>80 THEN '80' ELSE '90' END AS Column1,
    CASE WHEN  AVG( FD.BENEFITSCONTRIBUTIONS)>50 THEN '50' ELSE '90' END AS Column2,
            FROM   DBO.WS_FUNDDETAIL AS D 
            LEFT OUTER JOIN DBO.V_FUNDNOOUTOFPOCKET AS NOP ON D.FUNDDETAILID = NOP.FUNDDETAILID 
            INNER JOIN DBO.WS_FUNDDATA AS FD ON NOP.FUNDREPORTID = FD.FUNDREPORTID 
            GROUP BY  D.FUNDCODE, D.FUNDNAME

)

INSERT INTO IF_FUNDDETAILS  ( FUNDCODE,   FUNDNAME,  Column1,Column2, Column3)
SELECT * , Column1*.666 Column2*.3333 AS Column3 from cte
  

Ответ №3:

Вы не можете сделать это только с помощью одного оператора insert.

Что вы можете сделать, это.

  1. Вставить в таблицу все значения, кроме столбца 3.

  2. Обновите строку выше для column3 как

    обновить table tblName установить Column3 = Column1*.666 Column2*.3333 предложение where

Надеюсь, это поможет.