【问题标题】:How can I compute values in a TSQL Update statement?如何计算 TSQL 更新语句中的值?
【发布时间】:2016-01-16 17:14:07
【问题描述】:

我想创建三个临时表,然后像这样组合它们的内容:

CREATE TABLE #TEMP1
MEMBERITEMCODE VARCHAR(25),
WEEK1USAGE VARCHAR(25),
WEEK1PRICE VARCHAR(25);

INSERT INTO #TEMP1 (MEMBERITEMCODE, WEEK1USAGE, WEEK1PRICE)
SELECT MEMBERITEMCODE, SUM(QTYSHIPPED), PRICE 
FROM INVOICEDETAIL 
WHERE UNIT=@UNIT AND INVOICEDATE BETWEEN @BEGDATE AND @WEEK1END
GROUP BY MEMBERITEMCODE, PRICE

CREATE TABLE #TEMP2
MEMBERITEMCODE VARCHAR(25),
WEEK2USAGE VARCHAR(25),
WEEK2PRICE VARCHAR(25);

INSERT INTO #TEMP2 (MEMBERITEMCODE, WEEK2USAGE, WEEK2PRICE)
SELECT MEMBERITEMCODE, SUM(QTYSHIPPED), PRICE 
FROM INVOICEDETAIL 
WHERE UNIT=@UNIT AND INVOICEDATE BETWEEN @WEEK2BEGIN AND @ENDDATE
GROUP BY MEMBERITEMCODE, PRICE

CREATE TABLE #TEMP3
MEMBERITEMCODE VARCHAR(25),
DESCRIPTION VARCHAR(200),
THIS VARCHAR(25),
THAT VARCHAR(25),
THEOTHERTHING VARCHAR(25);

INSERT INTO #TEMP3 (MEMBERITEMCODE, DESCRIPTION, THIS, THAT, THEOTHERTHING)
SELECT MEMBERITEMCODE, DESCRIPTION, THIS, THAT, THEOTHERTHING 
FROM INVOICEDETAIL 
WHERE UNIT=@UNIT AND INVOICEDATE BETWEEN @BEGDATE AND @ENDDATE

CREATE TABLE #TEMPCOMBINED
MEMBERITEMCODE VARCHAR(25),
DESCRIPTION VARCHAR(200),
THIS VARCHAR(25),
THAT VARCHAR(25),
THEOTHERTHING VARCHAR(25),
WEEK1USAGE VARCHAR(25),
WEEK1PRICE VARCHAR(25);
WEEK2USAGE VARCHAR(25),
WEEK2PRICE VARCHAR(25),
USAGEVARIANCE VARCHAR(25),
PRICEVARIANCE VARCHAR(25),
PRICEVARIANCEPERCENTAGE VARCHAR(25);

INSERT INTO #TEMPCOMBINED (MEMBERITEMCODE, DESCRIPTION, THIS, THAT, THEOTHERTHING, WEEK1USAGE, WEEK1PRICE, WEEK2USAGE, WEEK2PRICE, USAGEVARIANCE,
PRICEVARIANCE, PRICEVARIANCEPERCENTAGE)
SELECT T1.MEMBERITEMCODE, T3.DESCRIPTION, T3.THIS, T3.THAT, T3.THEOTHERTHING, T1.WEEK1USAGE, T1.WEEK1PRICE, T2.WEEK2USAGE, T2.WEEK2PRICE, NULL,  NULL,  NULL
FROM #TEMP1 T1
LEFT JOIN #TEMP2 T2 ON T1.MEMBERITEMCODE = T2.MEMBERITEMCODE
LEFT JOIN #TEMP3 T3 ON T1.MEMBERITEMCODE = T3.MEMBERITEMCODE

现在我想替换计算字段中的占位符 Null,但不知道该怎么做。到目前为止,我最好的想法是:

UPDATE #TEMPCOMBINED
SET USAGEVARIANCE = WEEK2USAGE - WEEK1USAGE,
PRICEVARIANCE = WEEK2PRICE - WEEK1PRICE,
PRICEVARIANCEPERCENTAGE = (WEEK2PRICE - WEEK1PRICE) / WEEK1PRICE

有没有更好的方法(例如,一个真正有效的方法)?

【问题讨论】:

  • 您不能对varchar 值进行计算。要么更改临时表中的类型,要么在计算中转换值。
  • Demo 这样的事情?当您插入数据(没有最后 3 列)时,它们将被计算
  • 您是否尝试过针对您创建的表运行该语句? AFAICT 你的陈述看起来不错。在 VARCHAR 中保存所有数据也是一个糟糕的主意。
  • 按照 Guffa 的建议,第一列可能如下所示:USAGEVARIANCE = cast(cast(WEEK2USAGE as numeric(11, 4)) - cast(WEEK1USAGE as numeric(11, 4)) as varchar(25)), ...
  • @lad2025:你应该这样回答。

标签: sql sql-server tsql sql-update calculated-columns


【解决方案1】:

第一件事:为什么要对以下列使用 varchar 数据类型?

USAGEVARIANCE, ,WEEK2USAGE,WEEK1USAGE,PRICEVARIANCE , WEEK2PRICE , WEEK1PRICE, PRICEVARIANCEPERCENTAGE, WEEK2PRICE , WEEK1PRICE,WEEK1PRICE ;

最好使用十进制或整数数据类型。当您使用sum() 函数计算其值时,它将返回整数/十进制值

第二:你可以在插入表格时计算USAGEVARIANCE,PRICEVARIANCE,PRICEVARIANCEPERCENTAGE。例如:

select a,b, (a-b) as USAGEVARIANCE, (c-d) as PRICEVARIANCE from table 

等然后插入到临时表中

【讨论】:

  • 我同意数据类型,但这就是原始表定义它们的方式。我会尽可能地改变它/使它正确。
【解决方案2】:

使用计算列:

CREATE TABLE #TEMPCOMBINED(
  MEMBERITEMCODE VARCHAR(25),
  DESCRIPTION VARCHAR(200),
  THIS VARCHAR(25),
  THAT VARCHAR(25),
  THEOTHERTHING VARCHAR(25),
  WEEK1USAGE DECIMAL(18,10),
  WEEK1PRICE DECIMAL(18,10),
  WEEK2USAGE DECIMAL(18,10),
  WEEK2PRICE DECIMAL(18,10),
  USAGEVARIANCE   AS WEEK2USAGE - WEEK1USAGE,
  PRICEVARIANCE   AS WEEK2PRICE - WEEK1PRICE,
  PRICEVARIANCEPERCENTAGE  AS (WEEK2PRICE - WEEK1PRICE) / WEEK1PRICE
);

LiveDemo

并在INSERT 语句中跳过它们:

INSERT INTO #TEMPCOMBINED (MEMBERITEMCODE, DESCRIPTION, THIS, THAT, THEOTHERTHING, WEEK1USAGE, WEEK1PRICE, WEEK2USAGE, WEEK2PRICE)
SELECT T1.MEMBERITEMCODE, T3.DESCRIPTION, T3.THIS, T3.THAT, T3.THEOTHERTHING, T1.WEEK1USAGE, T1.WEEK1PRICE, T2.WEEK2USAGE, T2.WEEK2PRICE
FROM #TEMP1 T1
LEFT JOIN #TEMP2 T2 ON T1.MEMBERITEMCODE = T2.MEMBERITEMCODE
LEFT JOIN #TEMP3 T3 ON T1.MEMBERITEMCODE = T3.MEMBERITEMCODE

警告:

除以WEEK1PRICE,这样你就可以添加 (WEEK2PRICE - WEEK1PRICE) / NULLIF(WEEK1PRICE,0) 避免数学异常或添加CHECK 约束以确保WEEK1PRICE 不为0。

【讨论】:

    【解决方案3】:

    更新您可以使用的一个表中的列 简单连接上的交叉连接

    例如:

    Update m
    Set col1 = col1 - col2
    From mytable m 
    join mytable n On m.col2 = n.col2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 2016-08-06
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多