如何计算TSQL Update语句中的值?

如何计算TSQL Update语句中的值?,sql,sql-server,tsql,sql-update,calculated-columns,Sql,Sql Server,Tsql,Sql Update,Calculated Columns,我想创建三个临时表,然后像这样组合它们的内容: 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 WH

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

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数据类型

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

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

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

select a,b, (a-b) as USAGEVARIANCE, (c-d) as PRICEVARIANCE from table 
Update m
Set col1 = col1 - col2
From mytable m 
join mytable n On m.col2 = n.col2

etc,然后将其插入临时表中。第一件事:为什么要对以下列使用varchar数据类型

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

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

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

select a,b, (a-b) as USAGEVARIANCE, (c-d) as PRICEVARIANCE from table 
Update m
Set col1 = col1 - col2
From mytable m 
join mytable n On m.col2 = n.col2

etc,然后将其插入一个可使用的表中的临时表更新列中 简单连接上的交叉连接

例如:

select a,b, (a-b) as USAGEVARIANCE, (c-d) as PRICEVARIANCE from table 
Update m
Set col1 = col1 - col2
From mytable m 
join mytable n On m.col2 = n.col2

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

例如:

select a,b, (a-b) as USAGEVARIANCE, (c-d) as PRICEVARIANCE from table 
Update m
Set col1 = col1 - col2
From mytable m 
join mytable n On m.col2 = n.col2

使用计算列:

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
);

并在
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
警告:

week1价格划分
,以便您可以添加
(WEEK2PRICE-WEEK1PRICE)/NULLIF(WEEK1PRICE,0)
以避免数学异常,或添加
检查
约束以确保
WEEK1PRICE
不是0。

使用计算列:

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
);

并在
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
警告:

week1价格划分
,以便您可以添加
(WEEK2PRICE-WEEK1PRICE)/NULLIF(WEEK1PRICE,0)
以避免数学异常,或添加
检查
约束以确保
WEEK1PRICE
不是0。

您不能对
varchar
值进行计算。更改临时表中的类型,或在计算中强制转换值。像这样的?当您插入数据(没有最后3列)时,它们将被计算。您是否尝试对您创建的表运行该语句?看来你的陈述还可以。将所有数据都放在VARCHAR中也是一个糟糕的主意。按照Guffa的建议,第一列可能看起来像这样:
USAGEVARIANCE=cast(cast(WEEK2USAGE为numeric(11,4))-cast(WEEK1USAGE为numeric(11,4))为VARCHAR(25)),…
@lad2025:你应该回答这个问题。你不能对
varchar
值进行计算。更改临时表中的类型,或在计算中强制转换值。像这样的?当您插入数据(没有最后3列)时,它们将被计算。您是否尝试对您创建的表运行该语句?看来你的陈述还可以。把所有数据都放在VARCHAR中也是一个糟糕的主意。按照Guffa的建议,第一列可能是这样的:
USAGEVARIANCE=cast(cast(WEEK2USAGE为numeric(11,4))-cast(WEEK1USAGE为numeric(11,4))为VARCHAR(25)),…
@lad2025:你应该回答这个问题。我同意数据类型,但原始表就是这样定义的。我会尽可能地修改它/使其正确。我同意数据类型,但原始表就是这样定义的。我会尽量把它改好。