2016-01-16 32 views
0

我想創建三個臨時表,然後結合自己的內容,就像這樣:如何計算TSQL Update語句中的值?

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 [email protected] 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 [email protected] 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 [email protected] 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 

有沒有更好的方法(例如實際工作)?

+1

您無法對'varchar'值進行計算。請更改臨時表中的類型,或在計算中轉換值。 – Guffa

+1

[Demo](https://data.stackexchange.com/stackoverflow/query/424526)這樣的事情?當你插入數據(沒有最後3列)時,它們將被計算 – lad2025

+2

你是否試着對你創建的表運行該語句? AFAICT你的陳述看起來不錯。還有VARCHAR中的所有數據是一個可怕的想法。 –

回答

1

使用計算列:

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 CON以確保WEEK1PRICE不是0.

3

第一件事:爲什麼你要爲後面的列使用varchar數據類型?

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

這是更好地使用小數或整數數據類型。當您使用sum()函數來計算它的價值,它會返回INT /十進制值

二:你可以計算出USAGEVARIANCE,PRICEVARIANCE,PRICEVARIANCEPERCENTAGE同時插入到表中。例如:

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

等,然後在一個表中插入到臨時表

+0

我同意數據類型,但這就是原始表如何定義它們。我會改變它/儘可能地讓它變得正確。 –

1

更新列,您可以使用 十字架上的簡單連接加入

例如:

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