返回相等值的SQL Server非相等查询
我在下面有一个查询,它比较两个相关数据集,查找一个数据集的数量总和与另一个数据集不匹配的行。作为参考,一个数据集基于采购订单(MRP)和一个基于销售订单(ARUN),但它们链接在采购订单和销售订单编号以及物料、销售订单项目等上。查询运行良好,但结果显示的值相等,我的目标是指出它们不相等的地方。我要补充的是,不使用返回相等值的SQL Server非相等查询,sql,sql-server,duplicates,aggregation,Sql,Sql Server,Duplicates,Aggregation,我在下面有一个查询,它比较两个相关数据集,查找一个数据集的数量总和与另一个数据集不匹配的行。作为参考,一个数据集基于采购订单(MRP)和一个基于销售订单(ARUN),但它们链接在采购订单和销售订单编号以及物料、销售订单项目等上。查询运行良好,但结果显示的值相等,我的目标是指出它们不相等的地方。我要补充的是,不使用SUM的正常输出返回双倍的行,因为每个数据集都有一个将这些总计拆分为两行的数据集(装运被拆分,因此具有不同的集装箱编号)。我的目标是通过使用SUM函数来消除这个问题,并排除该唯一字段,从
SUM
的正常输出返回双倍的行,因为每个数据集都有一个将这些总计拆分为两行的数据集(装运被拆分,因此具有不同的集装箱编号)。我的目标是通过使用SUM
函数来消除这个问题,并排除该唯一字段,从而在之前进行聚合。你知道会发生什么吗?我已经包括了代码以及SUM和before的结果。所以在阿伦可以有一个唯一的集装箱编号,同样在MRP中也可以有一个唯一的时间表行
代码:
SELECT
M.STOCK_NUMBER AS [PO_NUMBER],
M.MATERIAL,
M.MATERIAL_DESCRIPTION,
M.SIZE_LITERAL,
A.GRID_VALUE,
SUM(M.QUANTITY) AS [PO_QTY],
SUM(A.QUANTITY) AS [SO_QTY],
M.SALES_ORDER_NUMBER,
M.SALES_ORDER_ITEM_NUMBER,
M.CUSTOMER_NAME,
M.PLANNED_RECEIPT_DATE AS [ETA],
M.PLANT_CODE,
M.STOCK_TYPE
FROM VW_MRP_ALLOCATION M
JOIN VW_ARUN_NORM_NEW A
ON M.SALES_ORDER_NUMBER = A.SALES_ORDER_NUMBER
AND M.SALES_ORDER_ITEM_NUMBER = A.SALES_ORDER_ITEM_NUMBER
AND M.STOCK_NUMBER = A.SAP_PO_NUMBER
AND M.SIZE_LITERAL = A.GRID_VALUE
AND M.STOCK_TYPE = A.STOCK_TYPE
AND M.MATERIAL = A.MATERIAL_NUMBER
WHERE M.REQUIREMENT_TYPE = 'KE'
AND M.STOCK_TYPE NOT IN ('A','C')
AND M.STOCK_NUMBER IS NOT NULL
AND M.QUANTITY <> A.QUANTITY
GROUP BY M.STOCK_NUMBER,
M.MATERIAL,
M.MATERIAL_DESCRIPTION,
M.SIZE_LITERAL,
M.SALES_ORDER_NUMBER,
M.SALES_ORDER_ITEM_NUMBER,
M.CUSTOMER_NAME,
M.PLANNED_RECEIPT_DATE,
M.PLANT_CODE,
M.STOCK_TYPE,
A.GRID_VALUE
ORDER BY M.STOCK_NUMBER,
M.SIZE_LITERAL ASC
如果我删除总和并将数量添加到组中,则得到以下结果:
PO_NUMBER MATERIAL MATERIAL_DESCRIPTION SIZE_LITERAL GRID_VALUE PO_QTY SO_QTY SALES_ORDER_NUMBER SALES_ORDER_ITEM_NUMBER CUSTOMER_NAME ETA PLANT_CODE STOCK_TYPE
------------ ------------------ ---------------------------------------- ------------ ---------- --------------------------------------- --------------------------------------- ------------------ --------------------------------------- ----------------------------------- ----------------------- ---------- ----------
0283472626 D93889 ADI STAIRS MEN BLACK L L 28 372 6194114805 10 ROSS STORES INC 2018-02-28 00:00:00.000 6010 L
0283472626 D93889 ADI STAIRS MEN BLACK L L 372 28 6194114805 10 ROSS STORES INC 2018-02-28 00:00:00.000 6010 L
0283472626 D93889 ADI STAIRS MEN BLACK M M 28 372 6194114805 10 ROSS STORES INC 2018-02-28 00:00:00.000 6010 L
0283472626 D93889 ADI STAIRS MEN BLACK M M 372 28 6194114805 10 ROSS STORES INC 2018-02-28 00:00:00.000 6010 L
0283472626 D93889 ADI STAIRS MEN BLACK S S 14 186 6194114805 10 ROSS STORES INC 2018-02-28 00:00:00.000 6010 L
0283472626 D93889 ADI STAIRS MEN BLACK S S 186 14 6194114805 10 ROSS STORES INC 2018-02-28 00:00:00.000 6010 L
0283472626 D93889 ADI STAIRS MEN BLACK XL XL 14 186 6194114805 10 ROSS STORES INC 2018-02-28 00:00:00.000 6010 L
0283472626 D93889 ADI STAIRS MEN BLACK XL XL 186 14 6194114805 10 ROSS STORES INC 2018-02-28 00:00:00.000 6010 L
如果我正确理解您的逻辑,那么您应该比较
HAVING
子句中的两个和:
SELECT
M.STOCK_NUMBER AS [PO_NUMBER],
M.MATERIAL,
M.MATERIAL_DESCRIPTION,
M.SIZE_LITERAL,
A.GRID_VALUE,
SUM(M.QUANTITY) AS [PO_QTY],
SUM(A.QUANTITY) AS [SO_QTY],
M.SALES_ORDER_NUMBER,
M.SALES_ORDER_ITEM_NUMBER,
M.CUSTOMER_NAME,
M.PLANNED_RECEIPT_DATE AS [ETA],
M.PLANT_CODE,
M.STOCK_TYPE
FROM VW_MRP_ALLOCATION M
INNER JOIN VW_ARUN_NORM_NEW A
ON M.SALES_ORDER_NUMBER = A.SALES_ORDER_NUMBER AND
M.SALES_ORDER_ITEM_NUMBER = A.SALES_ORDER_ITEM_NUMBER AND
M.STOCK_NUMBER = A.SAP_PO_NUMBER AND
M.SIZE_LITERAL = A.GRID_VALUE AND
M.STOCK_TYPE = A.STOCK_TYPE AND
M.MATERIAL = A.MATERIAL_NUMBER
WHERE
M.REQUIREMENT_TYPE = 'KE' AND
M.STOCK_TYPE NOT IN ('A','C') AND
M.STOCK_NUMBER IS NOT NULL AND
M.QUANTITY <> A.QUANTITY
GROUP BY
M.STOCK_NUMBER,
M.MATERIAL,
M.MATERIAL_DESCRIPTION,
M.SIZE_LITERAL,
M.SALES_ORDER_NUMBER,
M.SALES_ORDER_ITEM_NUMBER,
M.CUSTOMER_NAME,
M.PLANNED_RECEIPT_DATE,
M.PLANT_CODE,
M.STOCK_TYPE,
A.GRID_VALUE
HAVING
SUM(M.QUANTITY) <> SUM(A.QUANTITY)
ORDER BY
M.STOCK_NUMBER,
M.SIZE_LITERAL;
选择
M.库存编号为[采购订单编号],
M.MATERIAL,
M.材料描述,
M.SIZE_LITERAL,
A.u值,
金额(M.数量)为【采购订单数量】,
总(数量)为[库存数量],
M.销售订单号,
M.销售订单项目编号,
M.客户名称,
M.计划接收日期为[ETA],
M.PLANT_代码,
M.STOCK_型
来自VW_MRP_分配M
内部连接VW_ARUN_NORM_新A
M.SALES\u ORDER\u NUMBER=A.SALES\u ORDER\u NUMBER和
M.SALES\u ORDER\u ITEM\u NUMBER=A.SALES\u ORDER\u ITEM\u NUMBER和
M.库存编号=A.SAP采购订单编号和
M.SIZE\u LITERAL=A.GRID\u值和
M.库存类型=A.库存类型和
M.材料=A.材料编号
哪里
M.要求类型='KE'和
M.STOCK_类型不在('A','C')和
M.STOCK_编号不为空且
数量,数量
分组
M.STOCK_编号,
M.MATERIAL,
M.材料描述,
M.SIZE_LITERAL,
M.销售订单号,
M.销售订单项目编号,
M.客户名称,
M.计划接收日期,
M.PLANT_代码,
M.STOCK_类型,
A.u值
有
总和(M.数量)总和(A.数量)
订购人
M.STOCK_编号,
M.SIZE_-LITERAL;
如果我正确理解了您的逻辑,那么您应该在一个HAVING
子句中比较两个总和:
SELECT
M.STOCK_NUMBER AS [PO_NUMBER],
M.MATERIAL,
M.MATERIAL_DESCRIPTION,
M.SIZE_LITERAL,
A.GRID_VALUE,
SUM(M.QUANTITY) AS [PO_QTY],
SUM(A.QUANTITY) AS [SO_QTY],
M.SALES_ORDER_NUMBER,
M.SALES_ORDER_ITEM_NUMBER,
M.CUSTOMER_NAME,
M.PLANNED_RECEIPT_DATE AS [ETA],
M.PLANT_CODE,
M.STOCK_TYPE
FROM VW_MRP_ALLOCATION M
INNER JOIN VW_ARUN_NORM_NEW A
ON M.SALES_ORDER_NUMBER = A.SALES_ORDER_NUMBER AND
M.SALES_ORDER_ITEM_NUMBER = A.SALES_ORDER_ITEM_NUMBER AND
M.STOCK_NUMBER = A.SAP_PO_NUMBER AND
M.SIZE_LITERAL = A.GRID_VALUE AND
M.STOCK_TYPE = A.STOCK_TYPE AND
M.MATERIAL = A.MATERIAL_NUMBER
WHERE
M.REQUIREMENT_TYPE = 'KE' AND
M.STOCK_TYPE NOT IN ('A','C') AND
M.STOCK_NUMBER IS NOT NULL AND
M.QUANTITY <> A.QUANTITY
GROUP BY
M.STOCK_NUMBER,
M.MATERIAL,
M.MATERIAL_DESCRIPTION,
M.SIZE_LITERAL,
M.SALES_ORDER_NUMBER,
M.SALES_ORDER_ITEM_NUMBER,
M.CUSTOMER_NAME,
M.PLANNED_RECEIPT_DATE,
M.PLANT_CODE,
M.STOCK_TYPE,
A.GRID_VALUE
HAVING
SUM(M.QUANTITY) <> SUM(A.QUANTITY)
ORDER BY
M.STOCK_NUMBER,
M.SIZE_LITERAL;
选择
M.库存编号为[采购订单编号],
M.MATERIAL,
M.材料描述,
M.SIZE_LITERAL,
A.u值,
金额(M.数量)为【采购订单数量】,
总(数量)为[库存数量],
M.销售订单号,
M.销售订单项目编号,
M.客户名称,
M.计划接收日期为[ETA],
M.PLANT_代码,
M.STOCK_型
来自VW_MRP_分配M
内部连接VW_ARUN_NORM_新A
M.SALES\u ORDER\u NUMBER=A.SALES\u ORDER\u NUMBER和
M.SALES\u ORDER\u ITEM\u NUMBER=A.SALES\u ORDER\u ITEM\u NUMBER和
M.库存编号=A.SAP采购订单编号和
M.SIZE\u LITERAL=A.GRID\u值和
M.库存类型=A.库存类型和
M.材料=A.材料编号
哪里
M.要求类型='KE'和
M.STOCK_类型不在('A','C')和
M.STOCK_编号不为空且
数量,数量
分组
M.STOCK_编号,
M.MATERIAL,
M.材料描述,
M.SIZE_LITERAL,
M.销售订单号,
M.销售订单项目编号,
M.客户名称,
M.计划接收日期,
M.PLANT_代码,
M.STOCK_类型,
A.u值
有
总和(M.数量)总和(A.数量)
订购人
M.STOCK_编号,
M.SIZE_-LITERAL;
您的预期输出是什么,需要进行什么样的转换才能获取当前输出并生成您的预期输出?我的预期结果是,当MRP数据(M别名)的数量总和不等于ARUN数据(A别名)的数量总和时,我将取回这些行。我觉得这可能与我上面展示的第二个结果有关——没有求和函数。如果你注意到数量是相反的,我似乎不能让他们在任何组合使用ASC或DESC对齐。我的想法(可能是错误的)是,即使我在总结,它看到每一行,并看到它们在技术上并不“相等”,因此它显示的总和并不相等,即使它们是相等的-这只是一个想法,对于更多上下文,第一组结果返回,即使每种材料/尺寸的数量总和完全相同,您的预期输出是什么,需要什么样的转换才能获取当前输出并生成您期望的结果?我的预期结果是,当MRP数据(M别名)的数量总和不等于ARUN数据(A别名)的数量总和时,我将取回这些行。我觉得这可能与我上面展示的第二个结果有关——没有求和函数。如果你注意到数量是相反的,我似乎不能让他们在任何组合使用ASC或DESC对齐。我的想法(可能是错误的)是,即使我在总结,它看到每一行,并看到它们在技术上并不“相等”,所以它显示的总和并不相等,即使它们是相等的-这只是一个想法对于更多的上下文来说,第一组结果是返回的,即使每种材料/尺寸的数量总和完全相同-这确实有效-我总是忘记-你只能使用当您有一个GROUP BY时-正确吗?@user3496218在SQL Server中,是的,这是正确的。在MySQL中,可以使用HAVING
而不使用groupby
,但这基本上是唯一允许它的数据库。这可能是一个愚蠢的问题,但是使用WHERE与使用HAVING有什么区别?我从未完全理解,WHERE
子句是在groupby/HAVING
之前应用的,WHERE会影响单个行。另一方面,