Как мне создать запрос, который даст мне совокупный итог? - PullRequest
1 голос
/ 18 января 2012

У меня есть таблица со следующими столбцами: reportDate DATETIME и убытки CURRENCY и, конечно, столбец ID.

Как мне написать запрос, который вернет таблицу с промежуточным итогом столбца потерь?Каждая дата будет иметь несколько записей, поэтому я думаю, что они будут использовать Sum () для каждой даты.Я знаю, что это связано с функцией DSum, но я все еще потерял на этом.Это должно выглядеть примерно так:

Month   Losses   Cum
-----   ------   -----
Jan     $3,000   $3,000
Feb     $2,000   $5,000
Mar     $1,500   $6,500

Мне кажется, что использование SQL-выражения, не относящегося к конкретному Access, было бы наиболее полезным для меня.Но все решения приветствуются.Спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 18 января 2012

Я нашел имена таблиц и полей в истории редактирования вашего вопроса, поэтому использовал эти имена в этом ответе. Вы не предоставили пример данных record_matYields, поэтому я создал свои собственные и надеюсь, что они подходят:

id reportDate gainOrLoss
 1 12/28/2011  $1,500.00
 2 12/29/2011    $500.00
 3 12/30/2011  $1,000.00
 4   1/2/2012     $10.00
 5   1/3/2012  $4,500.00
 6   1/4/2012    $900.00

Сначала я создал qryMonthlyLosses . Вот SQL и вывод:

SELECT
    Year(reportDate) AS reportYear,
    Month(reportDate) AS reportMonth,
    Min(y.reportDate) AS MinOfreportDate,
    Sum(y.gainOrLoss) AS SumOfgainOrLoss
FROM record_matYields AS y
GROUP BY
    Year(reportDate),
    Month(reportDate);

reportYear reportMonth MinOfreportDate SumOfgainOrLoss
      2011          12      12/28/2011       $3,000.00
      2012           1        1/2/2012       $5,410.00

Я использовал этот первый запрос для создания другого, qryCumulativeLossesByMonth :

SELECT
    q.reportYear,
    q.reportMonth,
    q.MinOfreportDate,
    q.SumOfgainOrLoss,
    (
        SELECT
        Sum(z.gainOrLoss)
        FROM record_matYields AS z
        WHERE z.reportDate < q.MinOfreportDate
    ) AS PreviousGainOrLoss
FROM qryMonthlyLosses AS q;

reportYear reportMonth MinOfreportDate SumOfgainOrLoss PreviousGainOrLoss
      2011          12      12/28/2011       $3,000.00 
      2012           1        1/2/2012       $5,410.00          $3,000.00

Наконец, я использовал qryCumulativeLossesByMonth в качестве источника данных в запросе, который преобразует выходные данные в соответствии с требуемым форматом.

SELECT
    q.reportYear,
    MonthName(q.reportMonth) AS [Month],
    q.SumOfgainOrLoss AS Losses,
    q.SumOfgainOrLoss +
        IIf(q.PreviousGainOrLoss Is Null,0,q.PreviousGainOrLoss)
        AS Cum
FROM qryCumulativeLossesByMonth AS q;

reportYear Month    Losses    Cum
      2011 December $3,000.00 $3,000.00
      2012 January  $5,410.00 $8,410.00

Возможно, вы могли бы преобразовать это в один запрос, используя подзапросы вместо отдельных именованных запросов. Я использовал этот пошаговый подход, потому что надеялся, что его будет легче понять.

Редактировать : Я вернул полное имя с помощью функции MonthName (). Если вам нужно сокращенное название месяца, передайте True в качестве второго параметра этой функции. Любой из них должен работать:

MonthName(q.reportMonth, True) AS [Month]
MonthName(q.reportMonth, -1) AS [Month]
1 голос
/ 18 января 2012

Эта страница выглядит хорошо для вас:

http://support.microsoft.com/kb/290136

К вашему сведению, я написал следующий T-SQL для SQL Server:

create table #a (key_col int, val int)

insert into #a values (1, 10)
insert into #a values (2, 10)
insert into #a values (3, 30)
insert into #a values (4, 10)

select x.key_col,x.val,sum(y.val) as cumulated
from #a x 
inner join #a y on
x.key_col >= y.key_col
group by x.key_col,x.val
order by x.key_col,x.val

drop table #a

Результат:

 key_col     val         cumulated   
 ----------- ----------- ----------- 
           1          10          10 
           2          10          20 
           3          30          50 
           4          10          60 
0 голосов
/ 19 января 2012

Это будет сделано для вас в одном SQL без использования временных таблиц

SELECT Format$([TranDate],"yyyy mm") AS mthYear, First(DSum("[GainOrLoss]","[Trans]","Format$([TranDate],'yyyy mm')='" & [mthYear] & "'")) AS ThisMonth, First(DSum("[GainOrLoss]","[Trans]","Format$([TranDate],'yyyy mm')<='" & [mthYear] & "'")) AS RunningTotal FROM trans GROUP BY Format$([TranDate],"yyyy mm");
...