【问题标题】:why is it giving incorrect syntax?为什么它给出不正确的语法?
【发布时间】:2013-10-11 10:42:21
【问题描述】:

我在 SQL 服务器中创建了 3 个名为 t_user_master、t_product_master 和 t_transaction 的表。t_user_master 通过列 Users_id 与 t_transaction 链接,t _product_master 通过列 Products_id 与 t_transaction 链接。现在我必须生成和输出,其中包括users_name(from t_user_master),Product_name(from t_product_master) 与它关联,以便查看哪些使用订购了哪些产品等等。 这是我的代码的 sn-p-

 SELECT um.Users_Name,
       pm.Product_Name,
       (SELECT SUM(Transaction_Amount)
        FROM   t_transaction
        WHERE  Transaction_Type = 'Order'
        GROUP  BY Users_Id,
                  Product_Id) AS Ordered_quantity,
       (SELECT SUM(Transaction_Amount)
        FROM   t_transaction
        WHERE  Transaction_Type = 'Payment'
        GROUP  BY Users_ID,
                  Product_Id) AS Amount_Paid,
       (SELECT MAX(Transaction_Date)
        FROM   t_transaction
        GROUP  BY Users_Id,
                  Product_Id) AS Last_Transaction_Date,
       (SELECT ( ( SUM(Transaction_Amount) * pm.Cost_per_Item ) - SUM(Transaction_Amount) ) )AS Balance
        FROM   t_user_master um
               JOIN t_transaction tr
                 ON um.Users_ID = tr.Users_ID
               JOIN t_product_master pm
                 ON tr.Product_ID = pm.Product_ID
    GROUP BY um.Users_Name,pm.Product_Name 

我已经说明了所有与语法相关的错误,但现在我面临另一个问题。执行它后,我收到此消息 - 列 't_product_master.Cost_Per_Item' 在选择列表中无效,因为它不包含在任一聚合中函数或 GROUP BY 子句。 我哪里错了?

【问题讨论】:

  • 你能给出确切的错误吗?它应该给你它发现问题的确切点,例如:Incorrect syntax near 'xxx
  • @ChrisL L 这是确切的错误 - 消息 102,级别 15,状态 1,第 80 行“产品名称”附近的语法不正确..这里第 80 行指向最后一行

标签: sql sql-server sql-server-2008


【解决方案1】:

您错过了第 10 行末尾的“)”和Last_Transaction_Date 之后的“,”。试试这个:

SELECT    um.Users_Name,pm.Product_Name,
(SELECT   SUM(Transaction_Amount)
 FROM     t_transaction 
 WHERE    Transaction_Type='Order' 
 GROUP BY Users_Id,Product_Id
) AS Ordered_quantity,
(SELECT   SUM(Transaction_Amount)
 FROM     t_transaction 
 WHERE    Transaction_Type='Payment'
 GROUP BY Users_ID,Product_Id
) AS Amount_Paid,
(SELECT   MAX(Transaction_Date)
 FROM     t_transaction 
 GROUP BY Users_Id,Product_Id
) AS Last_Transaction_Date,
(SELECT   ( ( SUM(Transaction_Amount)*pm.Cost_per_Item ) - SUM(Transaction_Amount) )
) AS Balance
FROM      t_user_master um 
JOIN      t_transaction tr ON um.Users_ID=tr.Users_ID
JOIN      t_product_master pm ON tr.Product_ID = pm.Product_ID

GROUP BY um.Users_Name,pm.Product_Name

【讨论】:

    【解决方案2】:

    至少你在这一行的末尾少了一个“,”:

    GROUP BY Users_Id,Product_Id) AS Last_Transaction_Date
    

    【讨论】:

      【解决方案3】:

      您在 LastTransactionDate 之后缺少一个逗号,并且您的 SELECT 的最后一列看起来格式不正确,即

      (SELECT ((SUM(Transaction_Amount)*pm.Cost_per_Item)-SUM(Transaction_Amount)) AS Balance
      

      【讨论】:

      • 即使纠正了那个错误,它仍然给出同样的错误。
      • 您的子查询也有问题(SELECT SUM(Transaction_Amount) FROM t_transaction WHERE Transaction_Type = 'Order' GROUP BY Users_Id, Product_Id) AS Ordered_quantity 将返回多行。它不允许在子查询中。您确实需要考虑重写查询。
      【解决方案4】:

      您的查询实际上存在三个问题:

      1. Last_Transaction_Date 后缺少逗号。
      2. 选择平衡时结束括号。
      3. 在计算余额时,您使用了 pm.Cost_per_Item。一旦您执行 GROUP BY,所有选择语句列都会根据结果分组行进行计算。我使用了 sum,但您可以根据需要使用任何其他聚合函数。

      正确的查询是:

      SELECT um.Users_Name,
          pm.Product_Name,
          (SELECT SUM(Transaction_Amount) FROM t_transaction 
          WHERE Transaction_Type='Order' 
          GROUP BY Users_Id,Product_Id) AS Ordered_quantity,
          (SELECT SUM(Transaction_Amount) FROM t_transaction 
          WHERE Transaction_Type='Payment'
          GROUP BY Users_ID,Product_Id )AS Amount_Paid,
          (SELECT MAX(Transaction_Date) FROM t_transaction 
            GROUP BY Users_Id,Product_Id) AS Last_Transaction_Date, -- error 1
           (SELECT ((SUM(Transaction_Amount)* sum(pm.Cost_per_Item))-SUM(Transaction_Amount))) AS 
            Balance -- error 2 and error 3
      FROM t_user_master um 
      JOIN t_transaction tr ON um.Users_ID=tr.Users_ID
      JOIN t_product_master pm ON tr.Product_ID = pm.Product_ID
      GROUP BY um.Users_Name,pm.Product_Name ;
      

      希望对你有帮助!!!

      【讨论】:

      • @deepshika 我无法了解您对第三个错误所做的更改
      • 要获得余额金额,您已使用 t_product_master.Cost_per_Item 值。这也应该聚合到一个标量值(即根据您的要求使用 Max、Sum、Min 任何函数)以获得正确的结果。
      猜你喜欢
      • 1970-01-01
      • 2011-02-04
      相关资源
      最近更新 更多