我想知道是否有办法让局部变量使用SELECT语句中的'FROM'语句,该语句未在变量的'SET'中声明。 我有以下示例:
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语句更简单(例如SELECT @ORDERQUANTITY - @ORDERSCANCELLED AS'Net Sold')
接受这个的最佳方式将不胜感激!
(使用SQL Server)
答案 0 :(得分:0)
你的意思是:
SELECT @ORDERQUANTITY = COALESCE((SELECT SUM(QUANTITY) FROM dbo.Table1), 0);
如果您的目标是让后续查询更具可读性,我建议使用更短的变量名称而不使用@ALLCAPSFORVARIABLENAMESBECAUSETHEYARENOTVERYREADABLE
。
此外,我不知道你要对GROUP BY
做什么,但它似乎根本没有必要(并且通过常量分组在任何情况下都不会做任何事情)。
现在,我不确定我是否完全遵循你想要做的事情。您是说您不想多次在SUM(QUANTITY)
列表中重复SELECT
,并且您希望用变量替换表达式而不是值* ?从您的代码中判断很难,但是这个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]
。
答案 1 :(得分:0)
如果你问的是你能做到这一点:
DECLARE @ORDERQUANTITY int;
DECLARE @ORDERSCANCELLED int;
SET @ORDERQUANTITY=ISNULL(SUM(Table1.QUANTITY),0);
SET @ORDERSCANCELLED=ISNULL(SUM(Table1.CANCELLED),0);
SELECT @ORDERQUANTITY - @ORDERSCANCELLED
答案是肯定的