列在选择列表中无效,因为它不包含在聚合函数或group by子句中

时间:2015-05-19 13:22:47

标签: java sql

我有一个看起来像这样的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子句中。

3 个答案:

答案 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和聚合的列。

(有些数据库会稍微放宽这一要求,导致结果非常混乱且难以理解)