![](/img/trans.png)
[英]SQL: Selecting record where values in one field are unique based off of most recent date
[英]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.