查询以获取最新日期的行

时间:2021-03-10 13:56:25

标签: sql crystal-reports

SELECT T0.[ItemCode], T0.[PriceFOB], T0.[PriceAtWH], T0.[DocEntry], T0.[CardCode], T2.[DocDate], T3.[CardName] FROM IPF1 T0 LEFT JOIN OIPF T2 ON T2.[DocDate] = (SELECT MAX(T4.[DocDate]) FROM OIPF T4 WHERE T0.[DocEntry]=T4.[DocEntry]) INNER JOIN OCRD T3 ON T0.[CardCode] = T3.[CardCode] WHERE T3.[GroupCode] = '105'

我正在使用上面列出的以下查询。

问题出现在我列出了多行相同的项目,但我的目标是获得最新的 DocDate。

如果有人可以帮助并解释我做错了什么。

我尝试过 Order By 和 Group By 但一直出现多个错误(主要是语法)

SELECT ItemCode, PriceAtWH, DocEntry, PriceFOB, CardCode FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY T0.[ItemCode] ORDER BY T0.[DocEntry] DESC) AS ROWNUM FROM IPF1 T0) IPF1 WHERE ROWNUM = 1

这是我能够接近我的解决方案的另一个查询,但我需要它仅过滤来自与 CardCode 匹配的 OCRD 的 GroupCode = '105'

主要目标是过滤掉与IPF1和OCRD(只需要从中提取组代码)结合的主数据,并首先用组代码过滤IPF1。然后继续为每个项目做 Max Date 或 Max DocEntry ID。

2 个答案:

答案 0 :(得分:0)

您可以使用 distinct 为每个事件获取一行,即使它们具有不同的日期并在选择中使用 MAX

<块引用>
    SELECT distinct T0.[ItemCode], 
           T0.[PriceFOB], 
           T0.[PriceAtWH], 
           T0.[DocEntry], 
           T0.[CardCode], 
           T3.[CardName], 
           MAX(T2.[DocDate] ) DocDate
FROM IPF1 T0     
LEFT JOIN OIPF T2 
ON T0.[DocEntry]=T2.DocEntry]
INNER JOIN OCRD T3 
ON T0.[CardCode] = T3.[CardCode] 
WHERE T3.[GroupCode] = '105'
GROUP BY T0.[ItemCode], T0.[PriceFOB], T0.[PriceAtWH], T0.[DocEntry], T0.[CardCode],T3.[CardName]

答案 1 :(得分:0)

WITH T AS (SELECT T10.[DocEntry], T10.[CardCode], T10.[ItemCode], T10.[PriceFOB], T10.[PriceAtWH] FROM IPF1 T10 INNER JOIN OCRD T11 ON T10.[CardCode] = T11.[CardCode] WHERE T11.[GroupCode] = '105') SELECT T.[DocEntry], T.[CardCode], T.[ItemCode], T.[PriceFOB], T.[PriceAtWH] FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY T.[ItemCode] ORDER BY T.[DocEntry] DESC) AS ROWNUM FROM T) T WHERE ROWNUM = 1

所以我最终解决了自己的问题。

感谢 Julissa 尝试购买您的查询有一个错误,即您在 DocEntry 前面缺少一个“[”,并且该查询没有按照我的要求执行,所有日期的同一项目的多个实例仍然显示向上。感谢您的尝试!