Sql 我试图构建一个查询,但不确定问题在哪里?
我已经编写了下面的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
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子句中?