正确设置SQL本地变量
我想知道是否有办法让本地变量使用未在变量的'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)
您是不是要找:
SELECT @ORDERQUANTITY = COALESCE((SELECT SUM(QUANTITY) FROM dbo.Table1), 0);
如果你的目标是让你的后续查询更具可读性,我建议较短的变量名,而不是使用@ALLCAPSFORVARIABLENAMESBECAUSETHEYARENOTVERYREADABLE
。
另外我不知道你想用GROUP BY
做什么,但它看起来并不是必要的(并且根据常量进行分组在任何情况下都不会做任何事情)。
现在,我不确定我是否完全按照你所要做的。你是否说你不想在SELECT
列表中多次重复SUM(QUANTITY)
列表,并且您想要替换表达式而不是变量值*?从你的代码很难说,但是这是SUM
应该代表整个表,还是只是给定的ID?一些想法:
-
如果你只是在寻找一个行特定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;
-
如果你想在整个表首先计算的金额,然后执行以下操作,所以你只需要执行一次这些计算:
SELECT @oq = SUM(Quantity), @oc = SUM(Cancelled) FROM dbo.Table1; ... and use those variables later ...
如果你想保存的值对于一个变量中的多个
@IDNO
值,您需要对此有不同的想法。当你处理多行数组时,不要再考虑变量。告诉我们你真正想要达到的目标,而不是告诉我们你的想法是如何实现的。
最后,请停止使用AS 'single quotes'
别名。如果您需要为列别名使用非法字符或保留字,请改为AS [square brackets]
。
如果你所要求的是,如果你能做到这一点:
DECLARE @ORDERQUANTITY int;
DECLARE @ORDERSCANCELLED int;
SET @ORDERQUANTITY=ISNULL(SUM(Table1.QUANTITY),0);
SET @ORDERSCANCELLED=ISNULL(SUM(Table1.CANCELLED),0);
SELECT @ORDERQUANTITY - @ORDERSCANCELLED
答案是肯定的
你的集合没有意义,因为它们(如OP的)引用'Table1'列,但不是表本身。 – 2013-04-05 18:01:11
是他的问题吗?如何将值存入变量? – Melanie 2013-04-05 18:31:33
不知道,但你的第三行将失败,因为它在哪里找到“Table1.QUANTITY”? – 2013-04-05 18:32:18
感谢,更清晰,我想设置的变量,然后使用这些变量在SELECT语句中的列的计算中重复使用,而不是重复表达式(例如'SUM(Quantity)'多次。我的SELECT语句是SET语句之下的单独语句,因为它也有简单的数据在我的SELECT语句中还有FROM和WHERE子句...所以我需要在变量的设置中使用FROM语句,并且FROM状态在它下面的SELECT语句中使用这些变量来计算值? – 2013-04-05 18:44:37
我不确定你的新问题中哪些部分我还没有回答。 – 2013-04-05 18:45:26