0

我想知道是否有办法让局部变量使用未在变量的“SET”中声明的 SELECT 语句中的“FROM”语句。我有以下示例:

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 服务器)

4

2 回答 2

1

你的意思:

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

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

此外,我不知道你想用它做什么,GROUP BY但它似乎根本没有必要(并且按常量分组在任何情况下都不会做任何事情)。

现在,我不确定我是否完全遵循您的尝试。您是说您不想SUM(QUANTITY)SELECT列表中重复多次,并且您想用变量替换表达式而不是 value*?很难从您的代码中分辨出来,但这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]改用我们。

于 2013-04-05T17:54:58.397 回答
-1

如果您要问的是您是否可以这样做:

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

答案是肯定的

于 2013-04-05T17:59:57.960 回答