代码之家  ›  专栏  ›  技术社区  ›  MilesToGoBeforeISleep

SQL:根据大小写表达式添加一个新列,并从另一个表中查找值

  •  0
  • MilesToGoBeforeISleep  · 技术社区  · 8 年前

    我试图将一个名为乘数的新列添加到名为交易的现有表中。此列的行值将取决于交易表中名为Type的另一列。如果类型不是“Equity”、“Corp”或“Option”,则需要从另一个名为ContractSize的表中查找该值。最后,我希望乘数列的数据类型为十进制(7,3)。我的代码是:

    ALTER TABLE Portfolio.Trades
    ADD Multiplier decimal(7,3) AS
    (
    CASE 
     WHEN Type = 'Equity' Then 1
     WHEN Type = 'Corp' Then 0.1
     WHEN Type = 'Option' Then 100
    ELSE
     (SELECT ContractSize FROM Portfolio.ContractSize CS
     JOIN Portfolio.Trades T
     ON T.Identifier = CS.ContractSize)
    )
    

    Msg 156,15级,状态1,第2行

    我们非常感谢您的指导。

    3 回复  |  直到 8 年前
        1
  •  5
  •   Gordon Linoff    8 年前

    分两步进行:

    ALTER TABLE Portfolio.Trades ADD Multiplier decimal(7,3);
    
    UPDATE T
        SET Multiplier = (CASE WHEN T.Type = 'Equity' Then 1
                               WHEN T.Type = 'Corp' Then 0.1
                               WHEN T.Type = 'Option' Then 100
                               ELSE (SELECT CS.ContractSize
                                     FROM Portfolio.ContractSize CS
                                     WHERE T.Identifier = CS.ContractSize)
                           END)
        FROM Portfolio.Trades T;
    

    我猜 ON

    UPDATE T
        SET Multiplier = (CASE WHEN T.Type = 'Equity' Then 1
                               WHEN T.Type = 'Corp' Then 0.1
                               WHEN T.Type = 'Option' Then 100
                               ELSE T.Identifier)
                           END)
        FROM Portfolio.Trades T;
    

        2
  •  0
  •   Serg    8 年前

    为什么要在表中添加列?也可以创建视图。

    CREATE VIEW myView AS
        SELECT *, -- your real column list here
            CAST(CASE
             WHEN Type = 'Equity' Then 1
             WHEN Type = 'Corp' Then 0.1
             WHEN Type = 'Option' Then 100
             ELSE
               (SELECT ContractSize 
                FROM Portfolio.ContractSize CS
                WHERE T.Identifier = CS.ContractSize)
             END AS decimal(7,3)) AS  Multiplier
        FROM
        Portfolio.Trades T;
    
        3
  •  0
  •   Nidhi    8 年前

    ALTER TABLE Portfolio.Trades
    ADD Multiplier decimal(7,3) AS
    (
    CASE 
     WHEN Type = 'Equity' Then 1
     WHEN Type = 'Corp' Then 0.1
     WHEN Type = 'Option' Then 100
    ELSE
     (SELECT ContractSize FROM Portfolio.ContractSize CS
     JOIN Portfolio.Trades T
     ON T.Identifier = CS.ContractSize)END
    )