我正在使用Microsoft SQL Server Management Studio 2018进行查询,并且试图获取每个订单的'腔'零件类型总数,并且我注意到1个订单有些异常。我99%的确定它已经正确添加到SQL数据库中,因为每个订单都是首先在Access中创建的,并且此订单的.mdb文件仅包含40个“腔”部分。但是,当我运行SQL查询时,我总共得到248个248部分。
到目前为止,我尝试使用代码,不同的联接,在SELECT和GROUP BY子句中删除/添加不同的列,并且仅使用NOT LIKE方法过滤掉部分会有所帮助。
以下代码(用于显示差异的2个订单)返回2列和2行(按预期):
SELECT OrderNo, SUM(Quantity) FROM Orders
INNER JOIN Heading ON Orders.OrderID = Heading.OrderID
WHERE ComponentType LIKE 'Cavity' AND OrderNo LIKE '73966' OR OrderNo LIKE '73967'
GROUP BY OrderNo, Quantity
但是,我得到的命令73966有40个腔体零件(正确),而命令73967有248个零件(不正确)。
当我尝试更改查询并添加ComponentType(到SELECT和GROUP BY)时,这就是我得到的:
Order | Quantity | ComponentType
73966 40 Cavity
73967 16
73967 60 Bead type
73967 40 Cavity
73967 8 Cill
73967 42 Frame
73967 48 Sash
etc...
添加以下内容有助于过滤掉不需要的组件,但我认为没有必要获得正确的结果,因为将来添加任何其他内容都将迫使我更新查询。
WHERE (...) AND ComponentType NOT LIKE '%Bead type%'
我认为值得一提的是,这两个订单具有相同的组件类型(珠子类型,空腔,填充),并且只是订单号73967不能正确显示。有什么想法为什么我需要手动过滤此订单的所有其他零件类型,而不是用SQL为我做呢?
答案 0 :(得分:2)
您使用错误的OR子句。需要使用()检查两个OR条件
SELECT OrderNo, SUM(Quantity) FROM Orders
INNER JOIN Heading ON Orders.OrderID = Heading.OrderID
WHERE ComponentType = 'Cavity'
AND ( OrderNo = '73966' OR OrderNo = '73967')
GROUP BY OrderNo
并且您不应该在分组依据中使用聚合函数(数量)中的列(以这种方式求和失败
无论如何,如果不使用通配符,则应使用=而不是
SELECT OrderNo, SUM(Quantity) FROM Orders
INNER JOIN Heading ON Orders.OrderID = Heading.OrderID
WHERE ComponentType = 'Cavity'
AND OrderNo IN( '73966','73967')
GROUP BY OrderNo
或根据建议,您可以使用IN子句代替几个OR
{{1}}