2017-02-22 20 views
0

запросов, как показано ниже на ниже, но не кажется, работает правильно, просто нужно грести с самой последней датой начала заряда:Получение Дата MAX от SQL Query

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

Вы должны удалить PChar.[NET-AMT] из вашего group by/select

0

Перерыв запрос на две части. У вас есть выбор, который тянет «ключ» только с максимальной датой, затем присоединяется к аналогичному запросу, соединяющемуся с ключом плюс максимальная дата. Например:

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 должна помочь вам получить строку на основе группировки и ранжирования (есть также функция рангов, но давайте теперь будем работать с 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] 
Смежные вопросы