繁体   English   中英

根据SELECT字段中的一个值选择大型查询中的最新记录

[英]Selecting most recent record in large query based on one value in SELECT field

我有一个很大的查询,相对较大。 即使我已指定“ DISTINCT”,此查询也会在MATERIAL列上不断产生多个结果。 我认为通过指定“ DISTINCT”并求和我需要的值,它会为每个材料编号产生一行。 有人可以帮我看看我在做什么错。 我意识到此时最后一个子查询可能是多余的-我正在测试,这就是产生我得到的结果的原因。

提前谢谢。

DECLARE @daynumber as int
SET     @daynumber = CASE
                  WHEN DATENAME(dw,GETDATE()) = 'Monday'
                  THEN 56
                  WHEN DATENAME(dw,GETDATE()) = 'Tuesday' 
                  THEN 57
                  WHEN DATENAME(dw,GETDATE()) = 'Wednesday' 
                  THEN 58
                  WHEN DATENAME(dw,GETDATE()) = 'Thursday' 
                  THEN 59
                  WHEN DATENAME(dw,GETDATE()) = 'Friday' 
                  THEN 60
                  END;

SELECT          DISTINCT MATERIAL,
                PLANT_CODE,
                STOCK_CATEGORY,
                material_desc AS 'MATERIAL_DESC',
                division_id AS 'DIVISION_ID',
                UPPER(division_desc) AS 'DIVISION_DESC',
                UPPER(gender_id) AS 'GENDER_ID',
                UPPER(gender_desc) AS 'GENDER_DESC',
                DISTRIBUTION_VERSION_CODE,
                PERIOD_CODE,
                REQUIREMENTS_DATE,
                VERSION_IND_FLAG,
                TECHNICAL_INDEX,
                SIZE_LITERAL,
                [ORIGINAL FCST QTY],
                WITHDRAWN_QUANTITY,
                [REM PLAN QTY],
                FUTURE_FCST,
                TOTAL_OH_INV
FROM (

SELECT          P1.PLANT_CODE,
                P1.STOCK_CATEGORY,
                P1.MATERIAL,
                M1.material_desc AS 'MATERIAL_DESC',
                M1.division_id AS 'DIVISION_ID',
                UPPER(M1.division_desc) AS 'DIVISION_DESC',
                UPPER(M1.gender_id) AS 'GENDER_ID',
                UPPER(M1.gender_desc) AS 'GENDER_DESC',
                P1.DISTRIBUTION_VERSION_CODE,
                P1.PERIOD_CODE,
                P1.REQUIREMENTS_DATE,
                P1.VERSION_IND_FLAG,
                P1.TECHNICAL_INDEX,
                P1.SIZE_LITERAL,
                P1.[ORIGINAL FCST QTY],
                P1.WITHDRAWN_QUANTITY,
                P1.[REM PLAN QTY],
                P2.FUTURE_FCST,
                SUM(I1.ON_HAND_QUANTITY) AS 'TOTAL_OH_INV'
FROM

(SELECT         PLANT_CODE,
                STOCK_CATEGORY,
                MATERIAL,
                DISTRIBUTION_VERSION_CODE,
                PERIOD_CODE,
                REQUIREMENTS_DATE,
                PLANNED_QTY AS 'REM PLAN QTY',
                VERSION_IND_FLAG,
                SIZE_LITERAL,
                WITHDRAWN_QUANTITY,
                TECHNICAL_INDEX,
                PLANNED_QTY + WITHDRAWN_QUANTITY AS 'ORIGINAL FCST QTY'
 FROM           VW_PLANNED_REQMNTS_TXT 
 WHERE          PLANT_CODE IN ('6040','6041')
 AND            STOCK_CATEGORY IN ('A60385000','A60385003')
 AND            DISTRIBUTION_VERSION_CODE IN ('00','01','ZU','Z2')
 AND            REQUIREMENTS_DATE < GETDATE() - @daynumber
 AND            PLANNED_QTY > 0) AS P1

 LEFT OUTER JOIN      

 (SELECT
                SUM(PLANNED_QTY) AS 'FUTURE_FCST',
                MATERIAL,
                TECHNICAL_INDEX
 FROM           VW_PLANNED_REQMNTS_TXT P
 WHERE          REQUIREMENTS_DATE >= GETDATE()
 AND            PLANNED_QTY > 0
 AND            STOCK_CATEGORY IN ('A60385000','A60385003')
 GROUP BY       MATERIAL,
                TECHNICAL_INDEX,
                SIZE_LITERAL) AS P2
 ON             P1.MATERIAL = P2.MATERIAL
 AND            P1.TECHNICAL_INDEX = P2.TECHNICAL_INDEX

 LEFT OUTER JOIN 

 (SELECT        ON_HAND_QUANTITY,
                TECHNICAL_INDEX,
                MATERIAL,
                STOCK_CATEGORY,
                PLANT_CODE
  FROM          VW_INVENTORY I
  WHERE         STOCK_CATEGORY IN ('A60385000','A60385003')
  GROUP BY      TECHNICAL_INDEX,
                MATERIAL,
                STOCK_CATEGORY,
                ON_HAND_QUANTITY,
                PLANT_CODE) AS I1
  ON            P1.MATERIAL = I1.MATERIAL
  AND           P1.TECHNICAL_INDEX = I1.TECHNICAL_INDEX
  AND           P1.PLANT_CODE = I1.PLANT_CODE

  LEFT OUTER JOIN

 (SELECT        M.material_number, 
                M.material_desc,
                M.division_id,
                D.division_desc,
                M.gender_id,
                G.gender_desc
FROM            MaterialMaster.dbo.Material M

JOIN            MaterialMaster.dbo.Ref_Division D
ON              M.division_id = D.division_id
JOIN            MaterialMaster.dbo.Ref_Gender G
ON              M.gender_id = G.gender_id) AS M1

ON              P1.MATERIAL = M1.material_number


GROUP BY        P1.PLANT_CODE,
                P1.STOCK_CATEGORY,
                P1.MATERIAL,
                P1.DISTRIBUTION_VERSION_CODE,
                P1.PERIOD_CODE,
                P1.REQUIREMENTS_DATE,
                P1.[REM PLAN QTY],
                P1.VERSION_IND_FLAG,
                P1.WITHDRAWN_QUANTITY,
                P1.SIZE_LITERAL,
                P1.TECHNICAL_INDEX,
                P1.[ORIGINAL FCST QTY],
                P2.FUTURE_FCST,
                M1.material_desc,
                M1.division_id,
                M1.division_desc,
                M1.gender_id,
                M1.gender_desc) AS T1 /* T1 Represents "Total" for all */

GROUP BY        PLANT_CODE,
                STOCK_CATEGORY,
                MATERIAL,
                material_desc,
                division_id,
                division_desc,
                gender_id,
                gender_desc,
                DISTRIBUTION_VERSION_CODE,
                PERIOD_CODE,
                REQUIREMENTS_DATE,
                VERSION_IND_FLAG,
                TECHNICAL_INDEX,
                SIZE_LITERAL,
                [ORIGINAL FCST QTY],
                WITHDRAWN_QUANTITY,
                [REM PLAN QTY],
                FUTURE_FCST,
                TOTAL_OH_INV

您使用2次GROUP BY子句执行相同的操作。 外部GROUP BY无效。 此外,在已经使用GROUP BY使用DISTINCT意味着,如@mason在其评论中指出的那样,somethig是错误的。 您试图删除一些行,但这并不是一个好方法,它只会使问题变得模糊。

另一个建议:对于字段名称,请使用[]字符而不是'字符,例如M1.material_desc AS [MATERIAL_DESC] 它将提高SQL的可读性,这是您急需编写更长的查询的原因-char文字为红色。

因此,内部查询-问题部分-应该重新格式化为可读的:

SELECT  P1.PLANT_CODE, P1.STOCK_CATEGORY, P1.MATERIAL, M1.material_desc AS [MATERIAL_DESC], M1.division_id AS [DIVISION_ID], 
        UPPER(M1.division_desc) AS [DIVISION_DESC], UPPER(M1.gender_id) AS [GENDER_ID], UPPER(M1.gender_desc) AS [GENDER_DESC], 
        P1.DISTRIBUTION_VERSION_CODE, P1.PERIOD_CODE, P1.REQUIREMENTS_DATE, P1.VERSION_IND_FLAG, P1.TECHNICAL_INDEX, P1.SIZE_LITERAL, 
        P1.[ORIGINAL FCST QTY], P1.WITHDRAWN_QUANTITY, P1.[REM PLAN QTY], P2.[FUTURE_FCST], SUM(I1.ON_HAND_QUANTITY) 
        AS [TOTAL_OH_INV]
        FROM (SELECT PLANT_CODE, STOCK_CATEGORY, MATERIAL, DISTRIBUTION_VERSION_CODE, PERIOD_CODE, REQUIREMENTS_DATE, 
                     PLANNED_QTY AS [REM PLAN QTY], VERSION_IND_FLAG, SIZE_LITERAL, WITHDRAWN_QUANTITY, TECHNICAL_INDEX, 
                     PLANNED_QTY + WITHDRAWN_QUANTITY AS [ORIGINAL FCST QTY]
               FROM  VW_PLANNED_REQMNTS_TXT
               WHERE (PLANT_CODE IN ('6040', '6041')) AND (STOCK_CATEGORY IN ('A60385000', 'A60385003')) 
                      AND (DISTRIBUTION_VERSION_CODE IN ('00', '01', 'ZU', 'Z2')) 
                      AND (REQUIREMENTS_DATE < GETDATE() - @daynumber) AND (PLANNED_QTY > 0)
        ) AS P1 LEFT OUTER JOIN
                    (SELECT  SUM(PLANNED_QTY) AS [FUTURE_FCST], MATERIAL, TECHNICAL_INDEX
                     FROM    VW_PLANNED_REQMNTS_TXT AS P
                     WHERE   (REQUIREMENTS_DATE >= GETDATE()) AND (PLANNED_QTY > 0) 
                             AND (STOCK_CATEGORY IN ('A60385000', 'A60385003'))
                     GROUP BY MATERIAL, TECHNICAL_INDEX, SIZE_LITERAL 
        ) AS P2 ON P1.MATERIAL = P2.MATERIAL AND P1.TECHNICAL_INDEX = P2.TECHNICAL_INDEX 
        LEFT OUTER JOIN
                    (SELECT  ON_HAND_QUANTITY, TECHNICAL_INDEX, MATERIAL, STOCK_CATEGORY, PLANT_CODE
                     FROM    VW_INVENTORY AS I
                     WHERE   (STOCK_CATEGORY IN ('A60385000', 'A60385003'))
                     GROUP BY TECHNICAL_INDEX, MATERIAL, STOCK_CATEGORY, ON_HAND_QUANTITY, PLANT_CODE 
        ) AS I1 ON P1.MATERIAL = I1.MATERIAL AND P1.TECHNICAL_INDEX = I1.TECHNICAL_INDEX AND P1.PLANT_CODE = I1.PLANT_CODE 
        LEFT OUTER JOIN
               (SELECT   M.material_number, M.material_desc, M.division_id, D.division_desc, M.gender_id, G.gender_desc
                FROM     MaterialMaster.dbo.Material AS M 
                INNER JOIN MaterialMaster.dbo.Ref_Division AS D ON M.division_id = D.division_id 
                INNER JOIN MaterialMaster.dbo.Ref_Gender AS G ON M.gender_id = G.gender_id
        ) AS M1 ON P1.MATERIAL = M1.material_number
GROUP BY PLANT_CODE, STOCK_CATEGORY, MATERIAL, DISTRIBUTION_VERSION_CODE, PERIOD_CODE, REQUIREMENTS_DATE, 
        P1.[REM PLAN QTY], P1.VERSION_IND_FLAG, P1.WITHDRAWN_QUANTITY, P1.SIZE_LITERAL, P1.TECHNICAL_INDEX, P1.[ORIGINAL FCST QTY], 
        P2.[FUTURE_FCST], M1.material_desc, M1.division_id, M1.division_desc, M1.gender_id, M1.gender_desc

在这里您应该寻找自己的问题。

单独检查每个内部SELECT,以验证其是否返回了所需的结果。 问题可能是您从VW_PLANNED_REQMNTS_TXT中有两次SELECT。 我建议您尝试删除P2子查询,看看会发生什么。 为什么P2不属于P1子查询?

        FROM (SELECT PLANT_CODE, STOCK_CATEGORY, MATERIAL, DISTRIBUTION_VERSION_CODE, PERIOD_CODE, REQUIREMENTS_DATE, 
                     PLANNED_QTY AS [REM PLAN QTY], VERSION_IND_FLAG, SIZE_LITERAL, WITHDRAWN_QUANTITY, TECHNICAL_INDEX, 
                     PLANNED_QTY + WITHDRAWN_QUANTITY AS [ORIGINAL FCST QTY]
                     (SELECT SUM(PLANNED_QTY) 
                     FROM    VW_PLANNED_REQMNTS_TXT 
                     WHERE   (REQUIREMENTS_DATE >= GETDATE()) AND (PLANNED_QTY > 0) 
                             AND (STOCK_CATEGORY IN ('A60385000', 'A60385003'))
                             AND MATERIAL=P.MATERIAL AND TECHNICAL_INDEX=P.TECHNICAL_INDEX
                     GROUP BY SIZE_LITERAL) AS [FUTURE_FCST]
               FROM  VW_PLANNED_REQMNTS_TXT P
               WHERE (PLANT_CODE IN ('6040', '6041')) AND (STOCK_CATEGORY IN ('A60385000', 'A60385003')) 
                      AND (DISTRIBUTION_VERSION_CODE IN ('00', '01', 'ZU', 'Z2')) 
                      AND (REQUIREMENTS_DATE < GETDATE() - @daynumber) AND (PLANNED_QTY > 0)
        ) AS P1 
        LEFT OUTER JOIN
                    (SELECT  ON_HAND_QUANTITY, TECHNICAL_INDEX, MATERIAL, STOCK_CATEGORY, PLANT_CODE

LEFT OUTER JOIN也可以产生没有任何材料的行。 为什么不加入INNER JOIN?

但是您的问题不能在最后的GROUP BY子句中奇迹般地解决,因为在那里您只对所有选定字段中的一个字段求​​和。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM