Запрос повторяющихся записей - PullRequest
0 голосов
/ 19 сентября 2018

Я недавно изучал MySQL и SQL, но я вынужден работать с MS Access.Я имел большой успех в настройке и создании запросов с моими знаниями SQL, но теперь я застрял.Я все еще пытаюсь узнать больше о правильном объединении таблиц в запросах, и, исходя из своего опыта, MS Access не делает это проще.

У меня есть 5 таблиц, которые я пытаюсь сделать запрос.Table1 (он же munic для munic.ID) - это таблица, содержащая ключ, который связывает имя со следующими 4 таблицами.Все таблицы 2-4 содержат несколько уникальных записей, которые связаны с одной записью в таблице 1.Когда я запрашиваю каждую таблицу как пару с таблицей 1, я получаю именно те результаты, которые мне нужны.Тем не менее, когда я пытаюсь сделать запрос к таблицам 1-4 вместе, я получаю в 4 раза больше записей (как, например, записи в таблице 2 появляются в любом месте от 3 до 6 раз в результирующей электронной таблице).Это также проблематично, потому что я пытаюсь найти сумму для значений данных в таблицах 2-4, и при 4-кратном увеличении записей мои суммы увеличиваются в 4 раза.

Примечание: четного числа записей нетдля каждой таблицы, связанной с ключом в таблице 1 (в таблице 2 содержится 35 записей, в таблице 3 - 12 и т. д. и т. д.)

Пример данных:

Table1
    ID  municipalities  county  population  website
    1   Anson   Somerset    2452    ansonmaine.town
    2   Arrowsic    Sagadahoc   440 arrowsic.org/recycling

Table2
    ID  waste-ID    munic-ID    report-year tons    cubic-yards dest-fac-ID origin
    1   45  1   2017    594     0   Maine
    2   28  1   2017    4           Maine

Итак, вот запросы, которые яработаю над: Запрос с 2 таблицами, предоставляет точные результаты (добро!)

SELECT DISTINCT 
    Table1.municipalities, 
    Table2.[report-year], 
    Sum(Table2.tons) AS [disp-tons], 
    Sum(Table2.[cubic-yards]) AS [disp-cubic-yards], Count(Table2.ID) AS [disp-no-entries]
FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.[munic-ID]
GROUP BY Table1.municipalities, Table2.[report-year];

Запрос со всеми таблицами (предоставляет слишком много дубликатов, это больно):

SELECT DISTINCT 
    Table1.municipalities, 
    [Table2.tons] AS Table2_tons, 
    Table2.[cubic-yards] AS [Table2_cubic-yards], 
    Table3.tons AS Table3_tons, 
    Table3.[cubic-yards] AS [Table3_cubic-yards], 
    Table4.tons AS Table4_tons, 
    Table4.[cubic-yards] AS [Table4_cubic-yards], 
    [Table5].tons AS [Table5_tons], 
    [Table5].[cubic-yards] AS [Table5_cubic-yards]
FROM (((Table1 LEFT JOIN Table3 ON Table1.[ID] = Table3.[munic-ID]) LEFT JOIN Table2 ON Table1.[ID] = Table2.[munic-ID]) LEFT JOIN Table4 ON Table1.[ID] = Table4.[munic-ID]) LEFT JOIN [Table5] ON Table1.[ID] = [Table5].[munic-ID]
ORDER BY Table1.municipalities;

Если есть какой-либо совет о том, как сделать так, чтобы, когда я запрашиваю Table1.municipality и присоединяюсь к Table1 ID, я не получаю повторяющихся записей, это было бы очень полезно.Я попытался сгруппировать данные в своем запросе, но MS требует, чтобы ВСЕ было сгруппировано, а не только одно поле.Я также сделал математику, и когда я пытаюсь суммировать свои значения, как я выбираю их, я получаю примерно в 4 раза больше, чем должно быть.

Ожидаемый результат:

municipalities  recycle_tons    recycle_cubic-yards disposal_tons   disposal_cubic-yards    reuse_tons  reuse_cubic-yards   ben-use_tons    ben-use_cubic-yards                             
Anson   2017    114 2   598 0   0   0   0   0
Anson   2016    66  3   946 0   0   0   0   0
Arrowsic    2017    59  0   121 0   0   0   23  0
Arrowsic    2016    0   0   121 0   0   0   23  0
Auburn      2016    0   0   21428   0   0   0   1538    0

Фактический результат:

municipalities  report-year recycle_tons    recycle_cubic-yards disposal_tons   disposal_cubic-yards    reuse_tons  reuse_cubic-yards   ben-use_tons    ben-use_cubic-yards
Anson   2016    1       34                  
Anson   2016    1       157                 
Anson   2016    1       755                 
Anson   2016    3       34                  
Anson   2016    3       157                 
Anson   2016    3       755                 
Anson   2016    21      34                  
Anson   2016    21      157                 
Anson   2016    21      755                 
Anson   2016    43      34                  
Anson   2016    43      157                 
Anson   2016    43      755                 
Anson   2016    46      34                  
Anson   2016    46      157                 
Anson   2016    46      755                 
Anson   2017    1       4                   
Anson   2017    1       594                 
Anson   2017    3       4                   
Anson   2017    3       594                 
Anson   2017    21      4                   
Anson   2017    21      594                 
Anson   2017    43      4                   
Anson   2017    43      594                 
Anson   2017    46      4                   
Anson   2017    46      594                 
Arrowsic    2016    0       121             8   

Надеюсь, кто-то может помочь!Мне не терпится узнать, как правильно составлять запросы, поскольку мне часто приходится собирать огромное количество данных из нескольких нелогично спроектированных баз данных MS Access (я унаследовал их от предшественника).

ОБНОВЛЕНИЕНиже приведены примеры моих 5 таблиц, для которых я пытаюсь объединить записи (не как строки, но каждую таблицу следует добавлять как новые столбцы - но для каждой таблицы существует неравное количество записей)

TABLE1:
    ID  municipalities  county  population  website
    1   Anson   Somerset    2452    ansonmaine.town
    2   Arrowsic    Sagadahoc   440 arrowsic.org/recycling
    3   Auburn  Androscoggin    23000   auburnmaine.gov

TABLE2:
    ID  waste-ID    munic-ID    report-year tons    cubic-yards dest-fac-ID origin
    10  1   2   2017    59          Maine
    11  20  2   2017    0           Maine
    12  21  2   2017    0           Maine

TABLE3:
    ID  waste-ID    munic-ID    report-year tons    cubic-yards dest-fac-ID origin
    1   45  1   2017    594     0   Maine
    2   28  1   2017    4           Maine
    3   45  2   2017    121         Maine

TABLE4:
    ID  waste-ID    munic-ID    report-year tons    cubic-yards dest-fac-ID origin
    1   39  9   2017    280         Maine
    2   39  12  2017    74          Maine
    3   39  18  2017    3           Maine

TABLE5:
    ID  waste-ID    munic-ID    report-year tons    cubic-yards dest-fac-ID origin
    1   29  7   2017    10  0       Maine
    4   7   12  2017    25          Maine
    5   35  15  2017    208         Maine

1 Ответ

0 голосов
/ 20 сентября 2018

Предположим, что у вас есть 2 записи в Таблице 2, которые имеют [munic-id] из 1 и 3 такие записи в Таблице3, а затем объединение всех 3 таблиц даст вам результат 2x3 = 6 записей с [munic-id] 1.

Поскольку вы, кажется, планируете суммировать tons и [cubic-yards] для всех таблиц Table2-5, сгруппированных по [munic-id] и [report-year], я предлагаю сделать это в 4 отдельных запроса (Query2-5)а затем объединить запросы вместо таблиц.Поскольку численность населения в Таблице 1 со временем может меняться, я предлагаю также иметь таблицу (munic-pop), в которой численность населения составляет [munic-id] для каждого [report-year], это поможет объединить годы.

Объединенный запрос может выглядеть следующим образом (который больше не требует группировки):

munic-query

...