#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.
Что вы можете сделать, это.
-
Вставить в таблицу все значения, кроме столбца 3.
-
Обновите строку выше для column3 как
обновить table tblName установить Column3 = Column1*.666 Column2*.3333 предложение where
Надеюсь, это поможет.