Как заполнить дневные пробелы в таблице доступа? - PullRequest
0 голосов
/ 29 мая 2018

У меня есть таблица с именем Test с тремя столбцами: Account, Date, and Amount.Дата выглядит следующим образом:

Account  Date            Amount
1        25/01/2013      5000
1        20/01/2013      3000
2        25/01/2016      4000
2        20/01/2016      1000

По сути, сумма записывается только при ее изменении.Например, для Account 1 значение Amount составляло 3000 с 20.01.2013 по 24.01.2013, затем оно изменилось на 5000, и, следовательно, почему у нас есть запись.

Я хочудля завершения дней от первой записи до последней записи для каждого account

Например, для Account 1 я хочу, чтобы все дни с 20/01/2013 по 24/01/2013 вDate и 3000 в Amount

Я знаю, что это сложно, ваша помощь очень ценится.Большое спасибо !!

1 Ответ

0 голосов
/ 30 мая 2018

Вы просто должны были найти первые и последние даты.В любом случае:

Сначала найдите минимальную и максимальную даты:

SELECT 
    Account, 
    Min(tblProvider.[Entry Date]) AS FirstDate, 
    Max(tblProvider.[Entry Date]) AS LastDate
FROM 
    Test
GROUP BY 
    Account;

Сохраните это как qDateMinMax .

Затем создайте запрос фактора:

SELECT DISTINCT 
    [Thousands]+[Hundreds]+[Tens]+[Ones] AS Factor, 
    1000*Abs([Mille].[id] Mod 10) AS Thousands, 
    100*Abs([Centa].[id] Mod 10) AS Hundreds, 
    10*Abs([Deca].[id] Mod 10) AS Tens, 
    Abs([Uno].[id] Mod 10) AS Ones
FROM 
    MSysObjects AS Uno, 
    MSysObjects AS Deca,
    MSysObjects AS Centa, 
    MSysObjects AS Mille;

Сохраните это как qdxFactor .

Теперь соберите их:

SELECT 
    qDateMinMax.Account, 
    qDateMinMax.FirstDate, 
    qDateMinMax.LastDate, 
    DateAdd("d",[Factor],[FirstDate]) AS OtherDate,
        (Select Last(Amount) 
        From Test 
        Where Test.Account = qDateMinMax.Account 
        And Test.[Entry Date] = qDateMinMax.LastDate) As LastAmount
FROM 
    qDateMinMax, 
    qdxFactor
WHERE 
    DateAdd("d",[Factor],[FirstDate]) <= [LastDate]
ORDER BY 
    qDateMinMax.Account, 
    DateAdd("d",[Factor],[FirstDate]);

Для медиана :

SELECT 
    qDateMinMax.Account, 
    qDateMinMax.FirstDate, 
    qDateMinMax.LastDate, 
    DateAdd("d",[Factor],[FirstDate]) AS OtherDate, 
        (Select (Min(Amount) + Max(Amount)) / 2
        From Test 
        Where Test.Client = qDateMinMax.Account 
        And Test.[Entry Date] Between qDateMinMax.FirstDate And qDateMinMax.LastDate) AS MedAmount
FROM 
    qDateMinMax, 
    qdxFactor
WHERE 
    DateAdd("d",[Factor],[FirstDate]) <= [LastDate]
ORDER BY 
    qDateMinMax.Account, 
    DateAdd("d",[Factor],[FirstDate]);

Для группировки по году-месяцу:

SELECT DISTINCT 
    qDateMinMax.Account, 
    Format([FirstDate],"yyyymm") AS FirstYM, 
    Format([LastDate],"yyyymm") AS LastYM, 
    Format(DateAdd("d",[Factor],[FirstDate]),"yyyymm") AS YM, 
        (Select (Min(Amount) + Max(Amount)) / 2
        From Test 
        Where Test.Client = qDateMinMax.Account 
        And Test.[Entry Date] Between qDateMinMax.FirstDate And qDateMinMax.LastDate) AS MedAmount
FROM 
    qDateMinMax, 
    qdxFactor
WHERE 
    DateAdd("d",[Factor],[FirstDate]) <= [LastDate];

Для включения последней суммы:

SELECT DISTINCT 
    qDateMinMax.Account, 
    Format([FirstDate],"yyyymm") AS FirstYM, 
    Format([LastDate],"yyyymm") AS LastYM, 
    Format(DateAdd("d",[Factor],[FirstDate]),"yyyymm") AS YM, 
        (Select (Min(Amount) + Max(Amount)) / 2
        From Test 
        Where Test.Client = qDateMinMax.Account 
        And Test.[Entry Date] Between qDateMinMax.FirstDate And qDateMinMax.LastDate) AS MedAmount, 
        (Select Amount
        From Test 
        Where Test.Client = qDateMinMax.Account 
        And Test.[Entry Date] =LastDate) AS LastAmount
FROM 
    qDateMinMax, 
    qdxFactor
WHERE 
    DateAdd("d",[Factor],[FirstDate] <= [LastDate];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...