2016-01-16 2 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 

Теперь я хочу, чтобы заменить заполнители NULLS в вычисляемых полей, но не знаю, как сделать это. Моя лучшая идея:

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

Есть ли лучший способ (например, тот, который работает, например)?

+1

Вы не можете выполнять вычисления на значениях 'varchar'. EI измените тип в таблице temp или внесите значения в расчет. – 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), чтобы избежать Math исключения или добавления CHECK против чтобы WEEK1PRICE не был 0.

3

Первое: почему вы используете тип данных 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 

и т.д., а затем вставьте его во временную таблицу

+0

Я согласен с типами данных, но именно так определяются исходные таблицы. Я изменю его/сделаю правильно как можно больше. –

1

Обновить колонку в одной таблице вы можете использовать Крест присоединиться на простое соединение

Например:

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