【问题标题】:How to computed and add a new column in SQL如何在 SQL 中计算和添加新列
【发布时间】:2017-12-04 20:29:37
【问题描述】:

我有两张桌子

[Table_1] - 以特定货币表示的金额。

Currency  | Amount  
USD       |  243  
USD       |  212  
USD       |  432   
EUR       |  578  
EUR       |  112  
EUR       |  578  
GBP       |  965  
GBP       |  309

和 [Table_2] - 欧元和英镑对美元的汇率

Cur |   FX  
GBP | 1.43  
EUR | 1.18  
USD | 1

我需要将一个新列 [Amount in USD] 永久添加到 [Table_1] 中,它将所有货币转换为美元。基本上我需要将相应的货币乘以[Table_2]中给出的汇率。最终结果应该是这样的。

Currency  | Amount  |Amount in USD  
USD       |   243   |   243  
USD       |   212   |   212  
USD       |   432   |   432  
EUR       |   578   |   682  
EUR       |   112   |   132  
EUR       |   578   |   682  
GBP       |   965   |   1380  
GBP       |   309   |   442  

如果有人可以提供帮助,我将不胜感激。提前致谢。

【问题讨论】:

  • 不使用计算列,使用VIEW 怎么样?
  • 不确定,我从未使用过 VIEW。我的真实数据库有大约 1000 万行,我需要在进一步的计算中使用计算列。这也适用于 VIEW 吗?
  • 是的,引用MS Docs视图是一个虚拟表,其内容由查询定义。与表一样,视图由一组命名的列和数据行组成。除非被索引,否则视图不会作为存储在数据库中的一组数据值存在。数据的行和列来自定义视图的查询中引用的表,并在引用视图时动态生成。因此您可以像查询普通表一样查询它。请查看下面我的解决方案,了解如何创建视图或计算列。
  • 代码有效,但是当我检查解决方案时,视图表仅显示计算列。我的实际数据库有 28 列,所有这些都需要可见。
  • 您的示例数据仅包含 3 列,所以这就是您得到的 :)。如果您需要更多列,则需要将它们添加到视图 DDL。我无权访问你的系统,所以我不知道你有更多的列。但是,如果您对特定解决方案有疑问,请评论答案,而不是您的问题。

标签: sql-server multiplication calculated-columns


【解决方案1】:

为您提供两种解决方案。一个使用VIEW,另一个使用标量函数计算列(这就是您所说的):

--Create sample data
CREATE TABLE ExchangeRate (Currency char(3), FX decimal(8,2));
INSERT INTO ExchangeRate
VALUES ('GBP',1.43),
       ('EUR',1.18),
       ('USD',1);
GO

CREATE TABLE TransactionList (Currency char(3), Amount decimal(12,2));

INSERT INTO TransactionList
VALUES ('GBP',100),
       ('EUR', 100),
       ('USD',100);
GO
--View Solution
CREATE VIEW ValuesInUSD AS

    SELECT TL.Currency, TL.Amount, TL.Amount * ER.FX AS USDAmount
    FROM TransactionList TL
         JOIN ExchangeRate ER ON TL.Currency = ER.Currency;
GO
--Check results
SELECT *
FROM ValuesInUSD;

GO
--Function Solution
--Create Function
CREATE FUNCTION ExchangeToUSD (@Currency char(3), @Value decimal(12,2))
RETURNS DECIMAL(12,2)
AS BEGIN
    DECLARE @USD decimal(12,2);

    SELECT @USD =  @Value * FX
    FROM ExchangeRate
    WHERE Currency = @Currency;

    RETURN @USD;

END
GO
--Add Computed Column
ALTER TABLE TransactionList ADD ValueInUSD AS (dbo.ExchangeToUSD(Currency, Amount));
GO
--Check results
SELECT *
FROM TransactionList;
GO
--Clean up
DROP VIEW ValuesInUSD;
DROP TABLE TransactionList;
DROP FUNCTION ExchangeToUSD;
DROP TABLE ExchangeRate;
GO

【讨论】:

    【解决方案2】:

    试试这个方法

    SELECT 
        Currency
        ,Amount
        ,CEILING(ROUND((Amount*FX),1)) AS [Amount in USD]
    FROM Table_1 c1 
    INNER JOIN Table_2 c2
    ON c2.Cur=c1.Currency
    

    结果

    Currency    Amount  Amount in USD
    -----------------------------------
    USD          243       243
    USD          212       212
    USD          432       432
    EUR          578       682
    EUR          112       133
    EUR          578       682
    GBP          965       1380
    GBP          309       442
    

    【讨论】:

    • OP 说他们想要在表上计算列。
    【解决方案3】:

    试试这个

    CREATE  TABLE #Currency (Currency NVARCHAR(10),AMOUNT INT)
    CREATE TABLE #Exchange_Rate (Currency NVARCHAR(10),FX DECIMAL(15,2))
    
    INSERT INTO #Exchange_Rate
    SELECT 'GBP', 1.43    UNION ALL
    SELECT 'EUR', 1.18     UNION ALL
    SELECT 'USD' , 1
    
    INSERT INTO #Currency
    SELECT 'USD' ,243   UNION ALL
    SELECT 'USD',212    UNION ALL
    SELECT 'USD', 432   UNION ALL
    SELECT 'EUR',578    UNION ALL
    SELECT 'EUR',112    UNION ALL
    SELECT 'EUR', 578   UNION ALL
    SELECT 'GBP', 965   UNION ALL
    SELECT 'GBP',309
    
    SELECT * FROM #Exchange_Rate
    
    SELECT a.Currency,AMOUNT,a.AMOUNT * b.FX [Amount IN USD] 
    FROM #Currency a INNER JOIN #Exchange_Rate b ON a.Currency=b.Currency
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2022-01-06
      相关资源
      最近更新 更多