2013-04-05 2 views
-1

Мне интересно, есть ли способ, чтобы локальная переменная использовала оператор FROM из инструкции SELECT, которая не объявлена ​​в 'SET' переменной. У меня есть следующий пример:Правильно задает локальную переменную SQL

DECLARE @IDNO int; 
DECLARE @ORDERQUANTITY int; 

SET @IDNO='1'; --TEST VALUE 
SET @ORDERQUANTITY=ISNULL(SUM(Table1.QUANTITY), 0); 

SELECT 
Table1.IdNo AS 'ID No', 
@ORDERQUANTITY AS 'Order Quantity' 

FROM Table1 

WHERE IdNo = @IDNO 
GROUP BY IdNo, QUANTITY 

У меня есть много столбцов, которые добавляют столбцы вместе, и те столбцы, которые добавляются вместе получены из утверждений, как те, в переменной @ORDERQUANTITY.

Так вместо того, чтобы длинные определения столбцов в моем ЗЕЬЕСТЕ, я хотел бы, чтобы поместить вещи в переменных, чтобы сделать ЗЕЬЕСТ проще (например ВЫБРАТЬ @ORDERQUANTITY - @ORDERSCANCELLED AS «Net Продан»)

лучший способ приблизиться к этому будет оценен!

(с помощью SQL Server)

ответ

0

вы имели в виду:

SELECT @ORDERQUANTITY = COALESCE((SELECT SUM(QUANTITY) FROM dbo.Table1), 0); 

Если ваша цель состоит в том, чтобы сделать ваши последующие запросы более читаемым, я хотел бы предложить более короткие имена переменных, а не с помощью @ALLCAPSFORVARIABLENAMESBECAUSETHEYARENOTVERYREADABLE.

Также я понятия не имею, что вы пытаетесь сделать с GROUP BY, но он вообще не нужен (и группировка константой ничего не сделает в любом случае).

Теперь я не уверен, что я полностью следую тому, что вы пытаетесь сделать. Вы говорите, что не хотите повторять SUM(QUANTITY) в списке SELECT несколько раз, и вы хотите заменить выражение вместо значения * с переменной? Трудно сказать из вашего кода, но это SUM, который должен представлять всю таблицу, или только для данного идентификатора? Некоторые идеи:

  1. Если вы ищете только для одной строки для определенного ID, а затем использовать/производную таблицу КТР, так что вам не придется повторять расчеты:

    ;WITH x AS 
    (
        SELECT oq = SUM(Quantity), oc = SUM(Cancelled) 
        FROM dbo.Table1 WHERE IdNo = @IDNO 
    ) 
    SELECT 
        [Total Sold] = oq, 
        [Cancelled] = oc, 
        [Net Sold] = oq - oc 
    FROM x; 
    
  2. Если вы хотите, чтобы вычислить суммы первыми по всей таблице, а затем выполните следующие действия, чтобы вы только должны выполнить эти вычисления один раз:

    SELECT 
        @oq = SUM(Quantity), 
        @oc = SUM(Cancelled) 
    FROM dbo.Table1; 
    
    ... and use those variables later ... 
    
  3. Если вы пытаетесь удержать значение для нескольких значений @IDNO в одной переменной вам нужно подумать об этом по-другому. Перестаньте думать о переменных как о танках, когда вы имеете дело с наборами из нескольких строк. Расскажите нам, чего вы на самом деле хотите достичь, а не расскажите нам, как вы думаете, что вы можете достичь этого.

И, наконец, прекратите использование AS 'single quotes' псевдонимов. Если вам нужно иметь незаконные символы или зарезервированные слова для псевдонимов столбцов, пожалуйста, пожалуйста, AS [square brackets].

+0

Спасибо, чтобы быть более ясным, я пытаюсь установить переменные, а затем использовать те переменные многократно в вычислениях для столбцов в инструкции SELECT, а не повторять выражение (например, 'SUM (Quantity)" несколько раз. Оператор SELECT представляет собой отдельный оператор под инструкциями SET, так как он также имеет простые данные в нем есть предложения FROM и WHERE в моей инструкции SELECT ... так что мне нужно использовать инструкцию FROM в настройке переменных и stat stat в выражении SELECT ниже, которое использует эти переменные для вычисления значений? –

+0

Я не уверен, какие части вашего нового вопроса я еще не ответил. –

0

Если вы спрашиваете, если вы можете это сделать:

DECLARE @ORDERQUANTITY int; 
DECLARE @ORDERSCANCELLED int; 
SET @ORDERQUANTITY=ISNULL(SUM(Table1.QUANTITY),0); 
SET @ORDERSCANCELLED=ISNULL(SUM(Table1.CANCELLED),0); 
SELECT @ORDERQUANTITY - @ORDERSCANCELLED 

ответ да

+1

Ваши наборы не имеют смысла, потому что они (как OP) ссылаются на столбцы «Таблица1», но не на таблицу. –

+0

Это был его вопрос? Как получить значения в переменных? – Melanie

+0

не знаю, но ваша 3-я строка не сработает, потому что она найдет 'Table1.QUANTITY'? –