2013-11-27 3 views
-1

У меня есть таблица в MS Access, как показано ниже. Я хочу, чтобы количество записей имело одинаковые данные в таблице, как в столбце «Идентификатор» и столбец «Дата» и столбец «Принять» к каждой записи. В excel я использовал «countifs». Так как мне нужны все строки, потому что они не могут использовать «groupby» в доступе. Желаемый результат отображается в столбцах «подсчитывать - признать» и «счет - возврат»Подсчет в MS Access без «groupby»

Name ID Date  Admit/ Fees/  Count - Admit  Count - Refund 
           Refund 

ABC  11 11/11/2013 Admit 100   2     1 
BCD  12 11/11/2013 Admit 150   2     0 
CDE  13 12/11/2013 Admit 200   1     1 
DEF  14 13/11/2013 Admit 150   1     0 
ABC  11 11/11/2013 Refund -100  2     1 
CDE  13 12/11/2013 Refund -200  1     1 
ABC  11 11/11/2013 Admit 100   2     1 
BCD  12 11/11/2013 Admit 150   2     0 
+0

могли бы вы уточнить источник данных и целевой пожалуйста –

+0

@ Guilhem: источник данных и цели одни и те же таблицы. Результаты подсчета необходимо добавить как столбец в той же таблице – Nirav

+0

это для mysql или для доступа? (пустое имя столбца будет проблемой в mysql) –

ответ

0

Я думаю, что я вижу картину, но вы по-прежнему нужна группа по, но это было бы две части .. Во-первых, вам нужен ваш запрос по ID, чтобы вы могли применять подсчеты к исходным записям. Это все предполагается, что ваша таблица основана на первых пяти столбцах, представленных в вашем исходном сообщении.

select 
     YT.Name, 
     YT.ID, 
     YT.Date, 
     YT.AdmitRefund, 
     YT.Fees, 
     PQ.AdmitCount, 
     PQ.RefundCount 
    from 
     YourTable YT 
     JOIN (select YT2.ID 
         SUM(IIF(YT2.AdmitRefund = 'Admit', 1, 0)) AdmitCount, 
         SUM(IIF(YT2.AdmitRefund = 'Refund', 1, 0)) RefundCount 
        from 
         YourTable YT2 
        group by 
         YT2.ID) PQ 
      ON YT.ID = PQ.ID 

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

1
 UPDATE Table1 t1 
     JOIN (
     SELECT `name`, 
        `id`, 
        `date`, 
        `admit`, 
        (SELECT count(*) 
        FROM Table1 t1 
        WHERE t1.`Name` = t.`Name` 
        AND t1.`ID` = t.`ID` 
        AND t1.`Date` = t.`Date` 
        AND t1.`Admit` = t.`Admit` 
        ) `CAdmit` 
     FROM Table1 t 
    ) t2 
     ON t1.`Name` = t2.`Name` 
     SET t1.`CAdmit` = t2.`CAdmit` 
     WHERE  t1.`ID` = t2.`ID` 
        AND t1.`Date` = t2.`Date` 
        AND t1.`Admit` = t2.`Admit` 
     ; 

Working fiddle sample here

Вы можете посмотреть на то и MySQL - Update with counter based on subquery

2

В Access, для тестовых данных в таблице с именем [AdmitRefund]

Name ID Date  Admit_Refund Fees Count_Admit Count_Refund 
---- -- ---------- ------------ ---- ----------- ------------ 
ABC 11 2013-11-11 Admit   100       
BCD 12 2013-11-11 Admit   150       
CDE 13 2013-11-12 Admit   200       
DEF 14 2013-11-13 Admit   150       
ABC 11 2013-11-11 Refund  -100       
CDE 13 2013-11-12 Refund  -200       
ABC 11 2013-11-11 Admit   100       
BCD 12 2013-11-11 Admit   150       

следующий запрос

UPDATE AdmitRefund SET 
    Count_Admit = DCount("*", "AdmitRefund", "[ID]=" & [ID] & " AND [Date]=#" & Format([Date], "yyyy-mm-dd") & "# AND [Admit_Refund]=""Admit"""), 
    Count_Refund = DCount("*", "AdmitRefund", "[ID]=" & [ID] & " AND [Date]=#" & Format([Date], "yyyy-mm-dd") & "# AND [Admit_Refund]=""Refund""") 

заполняет столбцы как этот

Name ID Date  Admit_Refund Fees Count_Admit Count_Refund 
---- -- ---------- ------------ ---- ----------- ------------ 
ABC 11 2013-11-11 Admit   100   2    1 
BCD 12 2013-11-11 Admit   150   2    0 
CDE 13 2013-11-12 Admit   200   1    1 
DEF 14 2013-11-13 Admit   150   1    0 
ABC 11 2013-11-11 Refund  -100   2    1 
CDE 13 2013-11-12 Refund  -200   1    1 
ABC 11 2013-11-11 Admit   100   2    1 
BCD 12 2013-11-11 Admit   150   2    0 

Edit Re: комментарий

Этот запрос предполагается, что [ID] был числовой. Для [ID] как текст, использование:

UPDATE AdmitRefund SET 
    Count_Admit = DCount("*", "AdmitRefund", "[ID]='" & [ID] & "' AND [Date]=#" & Format([Date], "yyyy-mm-dd") & "# AND [Admit_Refund]=""Admit"""), 
    Count_Refund = DCount("*", "AdmitRefund", "[ID]='" & [ID] & "' AND [Date]=#" & Format([Date], "yyyy-mm-dd") & "# AND [Admit_Refund]=""Refund""") 
+0

@ Gord: Спасибо за решение. Кажется, это работает. Но проблема заключается в том, что при запуске запроса Access выводит сообщение об ошибке - «Access не обновлял поля из-за отказа преобразования типа» – Nirav

+0

@ user3041352 Измените свой вопрос, чтобы указать, какие типы полей. Или, если возможно, сделайте копию базы данных с таблицей в ней (вы можете удалить строки данных, если хотите), загрузить базу данных на [wikisend.com] (http://wikisend.com), а затем опубликовать ссылку здесь, чтобы мы могли взглянуть на нее. –

+0

Типы данных полей равны; ID - Текст, Дата - Дата/Время, Admit_Refund - Текст, Count_Admit - Number, Count_Refund - Number – Nirav

Смежные вопросы