2013-04-05 72 views
-1

我想知道是否有办法让本地变量使用未在变量的'SET'中声明的SELECT语句中的'FROM'语句。 我有以下示例:正确设置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变量声明的。

因此而不必在我的SELECT语句冗长列定义,我想打的东西在变量,以使SELECT语句简单(例如选择@ORDERQUANTITY - @ORDERSCANCELLED AS“网售”)

的最好的方法来处理这个将不胜感激!

(使用SQL Server)

回答

0

您是不是要找:

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

如果你的目标是让你的后续查询更具可读性,我建议较短的变量名,而不是使用@ALLCAPSFORVARIABLENAMESBECAUSETHEYARENOTVERYREADABLE

另外我不知道你想用GROUP BY做什么,但它看起来并不是必要的(并且根据常量进行分组在任何情况下都不会做任何事情)。

现在,我不确定我是否完全按照你所要做的。你是否说你不想在SELECT列表中多次重复SUM(QUANTITY)列表,并且您想要替换表达式而不是变量值*?从你的代码很难说,但是这是SUM应该代表整个表,还是只是给定的ID?一些想法:

  1. 如果你只是在寻找一个行特定ID,然后用一个CTE /派生表,这样你就不必重复计算:

    ;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语句之下的单独语句,因为它也有简单的数据在我的SELECT语句中还有FROM和WHERE子句...所以我需要在变量的设置中使用FROM语句,并且FROM状态在它下面的SELECT语句中使用这些变量来计算值? – 2013-04-05 18:44:37

+0

我不确定你的新问题中哪些部分我还没有回答。 – 2013-04-05 18:45:26

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的)引用'Table1'列,但不是表本身。 – 2013-04-05 18:01:11

+0

是他的问题吗?如何将值存入变量? – Melanie 2013-04-05 18:31:33

+0

不知道,但你的第三行将失败,因为它在哪里找到“Table1.QUANTITY”? – 2013-04-05 18:32:18