2014-01-09 3 views
0

Извините, что снова поднял эту тему, я столкнулся с несколькими полезными существующими сообщениями, которые очень похожи, но stackoverflow не позволит мне опубликовать комментарий/вопрос о существующем нить, потому что я такой новый (менее 50 баллов).Запуск Всего (до 2012 года) для более чем 1 группы

В любом случае, много общего количества сообщений отлично подходит для 1 группы/работает всего лишь. Как только я представляю вторую группу (которую я хочу, чтобы общее количество запусков начиналось с 0 снова), он продолжает добавлять их.

У меня был успех, используя причудливое обновление, CTE с рекурсией и т. Д. ... но не для нескольких групп.

Основной Ouput Я ищу выглядит следующим образом:

NAME DATE  DOLLARS  RUNNING 
John 1/1/2014 5   5 
John 1/2/2014 3   8 
John 1/2/2014 4   12 
John 1/2/2014 8   20 
John 1/3/2014 12   32 
Matt 1/1/2014 2   2 
Matt 1/2/2014 7   9 
Matt 1/3/2014 10   19 

Как я могу добиться этого? Благодаря кучу заранее

Вот некоторые из статей, с которыми я столкнулся, которые являются полезными:

Partitioning results in a running totals query

Using "Update to a local variable" to calculate Grouped Running Totals

+0

Я редактировал свой титул. См. [«Если вопросы включают« теги »в их названиях?»] (Http://meta.stackexchange.com/questions/19190/), где консенсус «нет, они не должны». –

+0

В вашем новом вопросе, откуда вы узнаете, какая из всех строк, находящихся в той же дате, на первом месте? – Lamak

+0

Это действительно datetime, поэтому я уже их заказывал datetime - спасибо – Jay

ответ

2

Вы можете сделать это с помощью связанного подзапроса:

select name, date, dollars, 
     (select sum(dollars) 
     from table t2 
     where t2.name = t.name and 
       t2.date <= t.date 
     ) as running 
from table t; 

EDIT:

Если у вас несколько строк в одну дату, вам необходимо ввести другой критерий заказа. Данные в вопросе не имеют другого столбца заказа (например, id). Таким образом, мы можем создать:

Единственная проблема заключается в том, что строки в пределах даты будут в произвольном порядке что может даже изменить между выполнением запроса. Таблицы SQL по сути неупорядочены, поэтому для указания порядка требуется столбец.

+0

Спасибо ЭТО РАБОТЫ, однако, если для одной и той же даты несколько строк, он возвращает мне _total_ _ручения total_ для каждой строки в этой группе дат. Я редактировал мой пост выше (извините). Может ли небольшая модификация вашего запроса дать эти результаты? Кроме того, если бы я представил новую колонку для группировки (например, КОМПАНИИ), могу ли я справиться с этим через это? Спасибо!! – Jay

+0

Еще раз спасибо за ответ! По какой-то причине это по-прежнему дает мне общее количество за каждый день в каждой строке для каждой даты, например, JOHN в 1/2/2014 получает «20» в столбце RUNNING для трех строк. – Jay

+0

Это очень странное поведение. Подзапрос 't' должен иметь порядковый номер, который является отдельным в каждой строке. Если у вас есть столбец 'id', добавьте его в' order by', чтобы сделать сортировку устойчивой ('порядок по дате, id'). –

2

Вы можете использовать OUTER APPLY:

SELECT A.[NAME], 
     A.[DATE], 
     A.DOLLARS, 
     SUM(B.[DOLLARS]) RUNNING 
FROM YourTable A 
OUTER APPLY (SELECT * 
      FROM YourTable 
      WHERE [NAME] = A.[NAME] 
      AND [DATE] <= A.[DATE]) B 
GROUP BY A.[NAME], 
     A.[DATE], 
     A.DOLLARS 
ORDER BY A.[NAME], 
     A.[DATE], 
     A.DOLLARS 

Here is a demo для вас попробовать. Результаты:

╔══════╦════════════╦═════════╦═════════╗ 
║ NAME ║ DATE ║ DOLLARS ║ RUNNING ║ 
╠══════╬════════════╬═════════╬═════════╣ 
║ John ║ 2014-01-01 ║  5 ║  5 ║ 
║ John ║ 2014-01-02 ║  3 ║  8 ║ 
║ John ║ 2014-01-03 ║  12 ║  20 ║ 
║ Matt ║ 2014-01-01 ║  2 ║  2 ║ 
║ Matt ║ 2014-01-02 ║  7 ║  9 ║ 
║ Matt ║ 2014-01-03 ║  10 ║  19 ║ 
╚══════╩════════════╩═════════╩═════════╝ 
+0

Спасибо за кучу - это дало мне результаты, которые я просил, но запрос выше дал результаты немного быстрее! еще раз спасибо – Jay

0

Вы можете использовать ROLLUP или CUBE вроде этого:

select name, date, dollars, sum(dollars) running 
from table t 
group by name, date, dollars with rollup 
Смежные вопросы