【问题标题】:Setting a SQL local variable properly正确设置 SQL 局部变量
【发布时间】:2013-04-05 17:50:53
【问题描述】:

我想知道是否有办法让局部变量使用未在变量“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 Server)

【问题讨论】:

    标签: sql sql-server local-variables


    【解决方案1】:

    你的意思是:

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

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

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

    现在,我不确定我是否完全按照您要执行的操作。您是说您不想在SELECT 列表中重复SUM(QUANTITY) 多次,并且您想用变量替换表达式 而不是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]

    【讨论】:

    • 谢谢,为了更清楚,我正在尝试设置变量,然后在 SELECT 语句中的列的计算中重复使用这些变量,而不是重复表达式(例如 SUM(Quantity)多次。我的 SELECT 语句是 SET 语句下方的单独语句,因为它还具有简单的数据检索操作。在我的 SELECT 语句中还有 FROM 和 WHERE 子句......所以我需要使用变量设置中的 FROM 语句,以及它下面的 SELECT 语句中的 FROM 语句,它使用这些变量来计算值?
    • 我不确定您的新问题的哪些部分我还没有回答。
    【解决方案2】:

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

    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 列而不是表本身。
    • 这是他的问题吗?如何将值放入变量中?
    • 不知道,但是你的第三行会失败,因为它在哪里找到Table1.QUANTITY
    • 是的,我知道,但我并没有专注于此,只是获取他的代码并输出我认为他的问题是,即,我可以在选择子句。 “因此,我不想在我的 SELECT 语句中定义冗长的列,而是将内容放在变量中以使 SELECT 语句更简单”我认为他只是为了节省打字而缩写。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 2022-01-07
    • 1970-01-01
    • 2013-10-18
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多