2017-02-22 127 views
0

查询MAX日期是低于每之下,但似乎并没有被正确地工作,只需要与最近的开始日期为充排:充分利用SQL查询

SELECT 

Loc.[PLACE-REF], 
Tenant.[TENANCY-REF], 
PChar.[ACCOUNT-CODE], 
MAX (PChar.[START-DATE]) AS "START-DATE", 
PChar.[NET-AMT] AS [PREVIOUS-MEALS-NET-AMOUNT] 

FROM 
dbo.[RE-TENANCY] AS TenanT 
LEFT OUTER JOIN 
dbo.[RE-TNCY-PLACE] AS TncyPlace ON TncyPlace.[TNCY-SYS-REF] = TenanT.[TNCY-SYS-REF] 
LEFT OUTER JOIN 
dbo.[IH-LOCATION] AS Loc ON Loc.[PLACE-REF] = TncyPlace.[PLACE-REF] 
LEFT OUTER JOIN 
dbo.[IH-PLACE-CHG] AS PChar ON Pchar.[PLACE-REF] = Loc.[PLACE-REF] 

WHERE 

(
    (Pchar.[START-DATE] = '04/01/2016') 
    OR 
    (Pchar.[START-DATE] BETWEEN '11/01/2016' AND '03/31/2017') 
) 
AND 
Tenant.[TNCY-STATUS] = 'CUR'   
AND 
PChar.[ACCOUNT-CODE] = 'MEALS' 
AND 
Loc.[PLACE-REF] = '166CHA010' 

GROUP BY 

Loc.[PLACE-REF], 
Tenant.[TENANCY-REF], 
PChar.[ACCOUNT-CODE], 
PChar.[NET-AMT] 

ORDER BY 

Loc.[PLACE-REF] 

Result

我查询不选择最新的日期,我不确定为什么?

感谢

+0

请添加一些数据,你看到什么和你的预期。如果你描述你的表格/模式,这将有所帮助 – EoinS

回答

0

我建议你删除组,然后更改选择所有(*)。结果中是最新日期吗?我怀疑它不是。

0

您应该从group by/select

0

删除PChar.[NET-AMT]打破查询了两个部分。有一个select只用最大日期拉'key',然后加入到一个类似的查询中加入密钥加上最大日期。 例如:

select B.* from 
    (select PLACE-REF, TENANCY-REF, ACCOUNT-CODE, MAX (START-DATE) AS "START-DATE" from tables...) A 
inner join 
    (select PLACE-REF, TENANCY-REF, ACCOUNT-CODE, START-DATE, NET-AMT AS [PREVIOUS-MEALS-NET-AMOUNT] from tables...) B 
on A.PLACE-REF = B.PLACE-REF and A.TENANCY-REF = B.TENANCY-REF and A.ACCOUNT-CODE = B.ACCOUNT-CODE and A.START-DATE = B.START-DATE 
0

它现在是不是从你的问题是很清楚你试图要检索的数据。但是,通常row_number函数应该可以帮助您获得基于分组和rank的行(还有一个rank函数,但现在让我们以row_number运行)。考虑到你的问题,这样的事情可能就是你所追求的。

SELECT * FROM 
(SELECT 
    Loc.[PLACE-REF], 
    Tenant.[TENANCY-REF], 
    PChar.[ACCOUNT-CODE], 
    PChar.[START-DATE], 
    ROW_NUMBER() OVER (PARTITION BY Loc.[PLACE-REF], 
     Tenant.[TENANCY-REF], 
     PChar.[ACCOUNT-CODE] 
    ORDER BY PChar.[START-DATE] DESC) AS rownum, 
    PChar.[NET-AMT] AS [PREVIOUS-MEALS-NET-AMOUNT] 
FROM 
dbo.[RE-TENANCY] AS TenanT 
LEFT OUTER JOIN 
dbo.[RE-TNCY-PLACE] AS TncyPlace ON TncyPlace.[TNCY-SYS-REF] = TenanT.[TNCY-SYS-REF] 
LEFT OUTER JOIN 
dbo.[IH-LOCATION] AS Loc ON Loc.[PLACE-REF] = TncyPlace.[PLACE-REF] 
LEFT OUTER JOIN 
dbo.[IH-PLACE-CHG] AS PChar ON Pchar.[PLACE-REF] = Loc.[PLACE-REF] 
WHERE 
(
    (Pchar.[START-DATE] = '04/01/2016') 
    OR 
    (Pchar.[START-DATE] BETWEEN '11/01/2016' AND '03/31/2017') 
) 
AND Tenant.[TNCY-STATUS] = 'CUR'   
AND PChar.[ACCOUNT-CODE] = 'MEALS' 
AND Loc.[PLACE-REF] = '166CHA010') A 
WHERE A.rownum = 1 
ORDER BY A.[PLACE-REF] 

写到这从内存,因此它可能并不完美,但它应该是接近的,似乎是你在找什么来得到你想要的数据。

+0

谢谢克里斯,这是伟大的:) –

0

如果你只是想排在前列...从克里斯·弗林

SELECT TOP 1 
Loc.[PLACE-REF], 
Tenant.[TENANCY-REF], 
PChar.[ACCOUNT-CODE], 
PChar.[START-DATE], 
PChar.[NET-AMT] AS [PREVIOUS-MEALS-NET-AMOUNT] 
FROM 
dbo.[RE-TENANCY] AS TenanT 
LEFT JOIN dbo.[RE-TNCY-PLACE] AS TncyPlace 
    ON TncyPlace.[TNCY-SYS-REF] = TenanT.[TNCY-SYS-REF] 
LEFT JOIN dbo.[IH-LOCATION] AS Loc 
    ON Loc.[PLACE-REF] = TncyPlace.[PLACE-REF] 
LEFT JOIN dbo.[IH-PLACE-CHG] AS PChar 
    ON Pchar.[PLACE-REF] = Loc.[PLACE-REF] 
WHERE 
(
    (Pchar.[START-DATE] = '04/01/2016') 
    OR 
    (Pchar.[START-DATE] BETWEEN '11/01/2016' AND '03/31/2017') 
) 
AND Tenant.[TNCY-STATUS] = 'CUR'   
AND PChar.[ACCOUNT-CODE] = 'MEALS' 
AND Loc.[PLACE-REF] = '166CHA010' 
ORDER BY PChar.[START-DATE] DESC 
; 
0

解决工作一种享受。感谢大家。

SELECT * FROM 
(SELECT 
    Loc.[PLACE-REF], 
    Tenant.[TENANCY-REF], 
    PChar.[ACCOUNT-CODE], 
    PChar.[START-DATE], 
    ROW_NUMBER() OVER (PARTITION BY Loc.[PLACE-REF], 
     Tenant.[TENANCY-REF], 
     PChar.[ACCOUNT-CODE] 
    ORDER BY PChar.[START-DATE] DESC) AS rownum, 
    PChar.[NET-AMT] AS [PREVIOUS-MEALS-NET-AMOUNT] 
FROM 
dbo.[RE-TENANCY] AS TenanT 
LEFT OUTER JOIN 
dbo.[RE-TNCY-PLACE] AS TncyPlace ON TncyPlace.[TNCY-SYS-REF] = TenanT.[TNCY-SYS-REF] 
LEFT OUTER JOIN 
dbo.[IH-LOCATION] AS Loc ON Loc.[PLACE-REF] = TncyPlace.[PLACE-REF] 
LEFT OUTER JOIN 
dbo.[IH-PLACE-CHG] AS PChar ON Pchar.[PLACE-REF] = Loc.[PLACE-REF] 
WHERE 
(
    (Pchar.[START-DATE] = '04/01/2016') 
    OR 
    (Pchar.[START-DATE] BETWEEN '11/01/2016' AND '03/31/2017') 
) 
AND Tenant.[TNCY-STATUS] = 'CUR'   
AND PChar.[ACCOUNT-CODE] = 'MEALS' 
`enter code here`AND Loc.[PLACE-REF] = '166CHA010') A 
WHERE A.rownum = 1 
ORDER BY A.[PLACE-REF]