Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我试图构建一个查询,但不确定问题在哪里?_Sql - Fatal编程技术网

Sql 我试图构建一个查询,但不确定问题在哪里?

Sql 我试图构建一个查询,但不确定问题在哪里?,sql,Sql,我已经编写了下面的SQL查询来连接四个表,并根据条件进行计算,但抛出了一个错误。谢谢你的帮助。谢谢 不知道我哪里做错了,或者我的逻辑是否正确 SELECT C.cust_name, R.Reg_name, sum(CASE WHEN P.Class = 'R' THEN T.Amount*.1 WHEN P.Class = 'P' THEN T.Amount*.2 ELSE T.Amount*.1 END) AS Calc_Amount FROM Customers

我已经编写了下面的SQL查询来连接四个表,并根据条件进行计算,但抛出了一个错误。谢谢你的帮助。谢谢

不知道我哪里做错了,或者我的逻辑是否正确

SELECT C.cust_name,
       R.Reg_name,
       sum(CASE WHEN P.Class = 'R' THEN T.Amount*.1 WHEN P.Class = 'P' THEN T.Amount*.2 ELSE T.Amount*.1 END) AS Calc_Amount
FROM Customers C,
     Regions R,
     transactions T,
     customer_class P
WHERE C.reg_id = R.reg_id, C.cust_id = T.cust_id, C.cust_id = P.cust_id
  AND P.class_id, P.class IN (SELECT max(class_id), class
                              FROM customer_class
                              GROUP BY cust_id)
  AND T.Time, T.Amount IN (SELECT max(time),
                                   Amount
                            FROM transactions
                            GROUP BY cust_id)
GROUP BY C.cust_name
ORDER BY C.cust_name

SQL命令未正确结束

在WHERE子句中,不能将多个条件与组合。您可能需要一个

WHERE C.reg_id = R.reg_id
  AND C.cust_id = T.cust_id
  AND C.cust_id = P.cust_id
但我强烈建议切换到FROM子句中的显式联接:

FROM Customers C 
  JOIN Regions R ON C.reg_id = R.reg_id
  JOIN transactions T ON C.cust_id = T.cust_id
  JOIN customer_class P ON C.cust_id = P.cust_id
此外,如果要使用带IN运算符的多列,则需要用括号将左侧的列括起来,例如p.class_id,p.class,而不是p.class_id,p.class

您还需要在GROUPBY子句中包含聚合中未使用的所有列

因此,完整的查询应该如下所示:

选择C.cust_名称, R.Reg_名称, 当P.Class='R'然后T.Amount*.1当P.Class='P'然后T.Amount*.2否则T.Amount*.1以Calc_Amount结尾时,sumCASE 来自客户C 在C.reg\u id=R.reg\u id上连接区域R 在C.cust\u id=T.cust\u id上加入事务T 在C.cust\u id=P.cust\u id上加入客户类P 其中P.class\u id,P.class在选择maxclass\u id,class中 来自客户_类 按客户id分组 选择maxtime,Amount中的时间和金额 来自交易 按客户id分组 按C.cust\u名称、R.Reg\u名称分组 按客户名称订购 我建议使用正确的连接语法和窗口函数。我想你想要这样的东西:

SELECT C.cust_name, 
       sum(CASE WHEN P.Class = 'R' THEN T.Amount*.1 WHEN P.Class = 'P' THEN T.Amount*.2 ELSE T.Amount*.1 END) AS Calc_Amount
FROM Customers C JOIN
     Regions R
     C.reg_id = R.reg_id JOIN
     (SELECT T.*,
             ROW_NUMBER() OVER (PARTITION BY T.cust_id ORDER BY T.Time DESC) as seqnum
      FROM transactions T
     ) T
     ON C.cust_id = T.cust_id AND seqnum = 1 JOIN
     (SELECT P.*,
             ROW_NUMBER() OVER (PARTITION BY P.cust_id ORDER BY P.class_id DESC) as seqnum
      FROM customer_class P
     ) P
     ON C.cust_id = P.cust_id
GROUP BY C.cust_name
ORDER BY C.cust_name;

然而,我不确定这种逻辑是否有用。您可能应该用示例数据和所需结果提出一个新问题。

基于@a_horse_和_no_name的答案-问题在于WHERE子句子查询中的GROUP BY表达式。看起来你应该使用

SELECT C.cust_name,
       R.Reg_name,
       sum(CASE WHEN P.Class = 'R' THEN T.Amount*.1 WHEN P.Class = 'P' THEN T.Amount*.2 ELSE T.Amount*.1 END) AS Calc_Amount
FROM Customers C 
  JOIN Regions R ON C.reg_id = R.reg_id
  JOIN transactions T ON C.cust_id = T.cust_id
  JOIN customer_class P ON C.cust_id = P.cust_id
WHERE (P.class_id, P.class) IN (SELECT max(class_id), class
                                FROM customer_class
                                GROUP BY class)
  AND (T.Time, T.Amount) IN (SELECT max(time), Amount
                             FROM transactions
                             GROUP BY amount)
GROUP BY C.cust_name, R.Reg_name
ORDER BY C.cust_name
这可能会执行,但我不确定它是否会给你想要的结果。另一种可能性是

SELECT C.cust_name,
       R.Reg_name,
       sum(CASE WHEN P.Class = 'R' THEN T.Amount*.1 WHEN P.Class = 'P' THEN T.Amount*.2 ELSE T.Amount*.1 END) AS Calc_Amount
FROM Customers C 
  JOIN Regions R ON C.reg_id = R.reg_id
  JOIN transactions T ON C.cust_id = T.cust_id
  JOIN customer_class P ON C.cust_id = P.cust_id
WHERE (P.class_id, P.class) IN (SELECT max(class_id), class
                                FROM customer_class
                                GROUP BY class)
  AND (T.cust_id, T.Time, T.Amount) IN (SELECT cust_id, max(time), max(Amount)
                                          FROM transactions
                                          GROUP BY cust_id)
GROUP BY C.cust_name, R.Reg_name
ORDER BY C.cust_name

但我怀疑第二次选择是否符合你的想法。但是如果没有测试数据和预期结果,就不可能理解您正在尝试做什么。您可能会考虑编辑问题并将测试数据和预期结果添加为文本,而不是图像,这样人们就可以根据预期结果测试查询。除此之外,问题似乎是您的WHERE条件是逗号分隔的,它们应该用AND或or分隔。你也有一个半奇怪的情况,P.class_id似乎错过了第二个part@JoakimDanielson-具有P.class\u id,P.class的零件看起来应该是…P.class\u id,P.class IN SELECT maxclass\u id,class。。。。同上,同样T.时间,T.金额应在括号内。谢谢您的评论。我现在没有收到GROUP BY expression错误。您需要在GROUP byI添加的GROUP BY C.cust_name、R.Reg_name;在最后,但得到相同的错误。有什么想法吗?@UttamDas:不要把列放在括号之间。我只是想知道问题是否出在WHERE语句中的GROUP BY子句中?