返回相等值的SQL Server非相等查询

返回相等值的SQL Server非相等查询,sql,sql-server,duplicates,aggregation,Sql,Sql Server,Duplicates,Aggregation,我在下面有一个查询,它比较两个相关数据集,查找一个数据集的数量总和与另一个数据集不匹配的行。作为参考,一个数据集基于采购订单(MRP)和一个基于销售订单(ARUN),但它们链接在采购订单和销售订单编号以及物料、销售订单项目等上。查询运行良好,但结果显示的值相等,我的目标是指出它们不相等的地方。我要补充的是,不使用SUM的正常输出返回双倍的行,因为每个数据集都有一个将这些总计拆分为两行的数据集(装运被拆分,因此具有不同的集装箱编号)。我的目标是通过使用SUM函数来消除这个问题,并排除该唯一字段,从

我在下面有一个查询,它比较两个相关数据集,查找一个数据集的数量总和与另一个数据集不匹配的行。作为参考,一个数据集基于采购订单(MRP)和一个基于销售订单(ARUN),但它们链接在采购订单和销售订单编号以及物料、销售订单项目等上。查询运行良好,但结果显示的值相等,我的目标是指出它们不相等的地方。我要补充的是,不使用
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会影响单个行。另一方面,