我有一个看起来像这样的Java方法:
public ArrayList<Orders> GetOrders(Connection connection, int id) throws Exception
{
ArrayList<Orders> feedData = new ArrayList<Orders>();
ArrayList<Integer> itemsId = new ArrayList<Integer>();
try
{
PreparedStatement ps = connection.prepareStatement("SELECT o.id, o.userId FROM dbo.Orders o join dbo.Items I on o.itemId = I.id join dbo.Users u on o.UserId = u.Id where o.userId = ? group by o.id, o.userId");
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
while(rs.next())
{
Orders o = new Orders();
o.setId(rs.getInt("id"));
ps = connection.prepareStatement("SELECT o.ItemId, SUM(price) as price FROM dbo.Orders o join dbo.Items I on o.itemId = I.id WHERE o.UserId= ? GROUP BY o.id");
ps.setInt(1, id);
ResultSet rs2 = ps.executeQuery();
while(rs2.next()){
itemsId.add(rs2.getInt("ItemId"));
//total = total + rs2.getInt("price");
}
o.setItem(itemsId);
o.setUserId(rs.getInt("userId"));
o.setTotalAmount(rs2.getInt("total"));
feedData.add(o);
}
return feedData;
}
}
在第二个准备好的声明中,我有这个查询:
SELECT o.ItemId, SUM(price) as price FROM dbo.Orders o join dbo.Items
I on o.itemId = I.id WHERE o.UserId= ? GROUP BY o.id
我得到了上述异常。
即
com.microsoft.sqlserver.jdbc.SQLServerException:列'dbo.Orders.ItemId'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
答案 0 :(得分:0)
问题是您在第二个代码段中选择了sum(price) as total
,因此结果集列的名称为total
。由于您按商品ID进行分组,因此您可以获得每件商品的价格总和,并且需要自己进行总计算或使用其他查询。
在while循环后尝试使用total += rs2.getInt("total");
和o.setTotalAmount(total)
。
答案 1 :(得分:0)
这似乎是您所指的查询:
SELECT ItemId, price
FROM dbo.Orders o join
dbo.Items I
on o.itemId = I.id
WHERE o.UserId= ?
GROUP BY o.id, o.ItemId;
您的查询不起作用,因为price
条款中没有group by
。
如果你想按项目计算价格总和,那么我认为你想要:
SELECT o.ItemId, SUM(price) as price
FROM dbo.Orders o join
dbo.Items I
on o.itemId = I.id
WHERE o.UserId= ?
GROUP BY o.ItemId;
答案 2 :(得分:0)
您遇到了SQL的基本要求。每当你有一个“group by”子句时,SQL只允许分组的列或聚合。
原因很简单:您在id
上喋喋不休,因此每个id
值都会有一个组,并且会在select
的结果中转换为一行} - 每个id值。现在假设给定itemId
有多个id
值,例如id
= 5的行的itemId
值为10,20和30。
SQL引擎不能将3个不同的值放入一行!
这就是为什么,当您执行group by
时,选择结果只能包含来自group by
和聚合的列。
(有些数据库会稍微放宽这一要求,导致结果非常混乱且难以理解)