Возникли проблемы при объединении запросов JET SQL - PullRequest
1 голос
/ 24 февраля 2009

Внимание: здесь будьте начинающим SQL! Будь нежным ...

У меня есть два запроса, которые независимо друг от друга дают мне то, что я хочу из соответствующих таблиц, достаточно своевременно, но когда я пытаюсь объединить эти два в (беспорядочное) объединение, вещи быстро разбиваются на части, и запрос либо дает мне дубликаты записей, выполнение которых занимает слишком много времени или вообще отказывается работать, цитируя различные синтаксические ошибки у меня.

Примечание: мне пришлось создать фиктивную таблицу (tblAllDates) с одним полем, содержащим даты с 1 января 2008 года, так как мне нужно, чтобы запрос возвращал одну запись из каждого дня, и в обеих таблицах есть дни, которые имеют нет данных. Это единственный способ сделать это, без сомнения, есть более разумный способ ...

Вот вопросы:

SELECT tblAllDates.date, SUM(tblvolumedata.STT)
FROM tblvolumedata RIGHT JOIN tblAllDates ON tblvolumedata.date=tblAllDates.date
GROUP BY tblAllDates.date;

SELECT tblAllDates.date, SUM(NZ(tblTimesheetData.batching)+NZ(tblTimesheetData.categorisation)+NZ(tblTimesheetData.CDT)+NZ(tblTimesheetData.CSI)+NZ(tblTimesheetData.destruction)+NZ(tblTimesheetData.extraction)+NZ(tblTimesheetData.indexing)+NZ(tblTimesheetData.mail)+NZ(tblTimesheetData.newlodgement)+NZ(tblTimesheetData.recordedDeliveries)+NZ(tblTimesheetData.retrieval)+NZ(tblTimesheetData.scanning)) AS VA
FROM tblTimesheetData RIGHT JOIN tblAllDates ON tblTimesheetData.date=tblAllDates.date
GROUP BY tblAllDates.date;

Лучший результат, который мне удалось получить, это:

SELECT tblAllDates.date, 0 AS STT, SUM(NZ(tblTimesheetData.batching)+NZ(tblTimesheetData.categorisation)+NZ(tblTimesheetData.CDT)+NZ(tblTimesheetData.CSI)+NZ(tblTimesheetData.destruction)+NZ(tblTimesheetData.extraction)+NZ(tblTimesheetData.indexing)+NZ(tblTimesheetData.mail)+NZ(tblTimesheetData.newlodgement)+NZ(tblTimesheetData.recordedDeliveries)+NZ(tblTimesheetData.retrieval)+NZ(tblTimesheetData.scanning)) AS VA
FROM tblTimesheetData RIGHT JOIN tblAllDates ON tblTimesheetData.date=tblAllDates.date
GROUP BY tblAllDates.date
UNION SELECT tblAllDates.date, SUM(tblvolumedata.STT) AS STT, 0  AS VA
FROM tblvolumedata RIGHT JOIN tblAllDates ON tblvolumedata.date=tblAllDates.date
GROUP BY tblAllDates.date;

Это дает мне данные VA и STT, которые я хочу, но в двух записях, где у меня есть данные от обоих за один день, например:

date         STT     VA
28/07/2008  0       54020
28/07/2008  33812   0
29/07/2008  0       53890
29/07/2008  33289   0
30/07/2008  0       51780
30/07/2008  30456   0
31/07/2008  0       52790
31/07/2008  31305   0

Что мне нужно, так это данные STT и VA в одной строке в день. Как это может быть достигнуто, и насколько я удален от запроса, который можно считать оптимальным? (не смейся, я только учусь!)

Ответы [ 3 ]

5 голосов
/ 24 февраля 2009

Вы можете поместить все это в один запрос, например, так:

SELECT 
dates.date, 
SUM(volume.STT) AS STT,
SUM(NZ(timesheet.batching)+NZ(timesheet.categorisation)+NZ(timesheet.CDT)+NZ(timesheet.CSI)+NZ(timesheet.destruction)+NZ(timesheet.extraction)+NZ(timesheet.indexing)+NZ(timesheet.mail)+NZ(timesheet.newlodgement)+NZ(timesheet.recordedDeliveries)+NZ(timesheet.retrieval)+NZ(timesheet.scanning)) AS VA
FROM 
tblAllDates dates 
LEFT JOIN tblvolumedata volume
ON dates.date = volume.date
LEFT JOIN tblTimesheetData timesheet
ON 
dates.date timesheet.date
GROUP BY dates.date;

Сначала я поставил таблицу дат в предложении FROM, а затем LEFT JOIN отредактировал две другие таблицы.

База данных Jet может быть смешной с более чем одним объединением в запросе, поэтому вам может понадобиться заключить одно из объединений в скобки (я думаю, это называется SQL Билла!) таблицы в построителе запросов, а затем принять представление кода SQL и изменить его, добавив в SUM s, GROUP BY и т. д.

EDIT:

Убедитесь, что поле даты в каждой таблице проиндексировано при присоединении к каждой таблице в этом поле.

РЕДАКТИРОВАТЬ 2:

Как насчет этого -

SELECT date, 
Sum(STT), 
Sum(VA)
FROM 
(SELECT dates.date, 0 AS STT, SUM(NZ(tblTimesheetData.batching)+NZ(tblTimesheetData.categorisation)+NZ(tblTimesheetData.CDT)+NZ(tblTimesheetData.CSI)+NZ(tblTimesheetData.destruction)+NZ(tblTimesheetData.extraction)+NZ(tblTimesheetData.indexing)+NZ(tblTimesheetData.mail)+NZ(tblTimesheetData.newlodgement)+NZ(tblTimesheetData.recordedDeliveries)+NZ(tblTimesheetData.retrieval)+NZ(tblTimesheetData.scanning)) AS VA
FROM tblTimesheetData RIGHT JOIN dates ON tblTimesheetData.date=dates.date
GROUP BY dates.date
UNION SELECT dates.date, SUM(tblvolumedata.STT) AS STT, 0  AS VA
FROM tblvolumedata RIGHT JOIN dates ON tblvolumedata.date=dates.date
GROUP BY dates.date
)
GROUP BY date;

Интересно, что когда я сравнил свое первое утверждение с некоторыми данными испытаний, все показатели STT и VA были умножены на 4 по сравнению со вторым утверждением. Очень странное поведение и, конечно, не то, что я ожидал.

0 голосов
/ 24 февраля 2009

Превратите SQL в представления и объедините их в даты.

0 голосов
/ 24 февраля 2009

Таблица дат - лучший способ.

Объедините объединения в предложении FROM. Как то так ....

SELECT d.date,
  a.value,
  b.value
FROM tableOfDates d
  RIGHT JOIN firstTable a
    ON d.date = a.date
  RIGHT JOIN secondTable b
    ON d.date = b.date
...