Я пытаюсь подготовить некоторые отчеты для учета рабочего времени сотрудников.
У нас есть две таблицы специально для этого вопроса. Сотрудники перечислены в Members
таблице, и каждый день они вводят временные записи выполненной ими работы и сохраняются в Time_Entry
таблице.
Пример настройки с использованием SQL Fiddle: http://sqlfiddle.com/#!3/e3806/7
В конечном итоге я буду за это таблица , которая показывает все , что Members
в списке столбцов , а затем будет показывать свои часы сумм на дату запрошены в других столбцах.
Кажется, проблема в том, что если в Time_Entry
таблице нет строки для конкретного члена, теперь есть строка для этого члена. Я пробовал несколько разных типов соединения (Left, Right, Inner, Outer, Full Outer и т. Д.), Но ни один из них, по-видимому, не дает мне то, что я хочу, что будет (на основе последнего примера в SQL Fiddle):
/*** Desired End Result ***/
Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL
ADavis | 0 | 11-10-2013 | 0 | 0
BTronton | 0 | 11-10-2013 | 0 | 0
CJones | 0 | 11-10-2013 | 0 | 0
DSmith | 0 | 11-10-2013 | 0 | 0
EGirsch | 1 | 11-10-2013 | 0.92 | 1
FRowden | 0 | 11-10-2013 | 0 | 0
Что я сейчас получаю, когда запрашиваю конкретную дату 11-1:
Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL
EGirsch | 1 | 11-10-2013 | 0.92 | 1
Это верно, основываясь на одной строке ввода времени, которая датирована 11-10-2013 для EGirsch, но мне нужно видеть нули для других участников, чтобы получать отчеты и, в конечном итоге, веб-панель / отчет для этой информации.
Это мой первый вопрос, и хотя я искал запросы на присоединение и т. Д. Я, честно говоря, не уверен, как эта функция может быть вызвана, поэтому я надеюсь, что это не дубликат и поможет другим тоже пытаться найти решение. похожие проблемы.
источник
WHERE
иAND
. Первоначально я использовал псевдонимы, но sqlfiddle, похоже, не понравился, поэтому я просто перешел в полный формат. Спасибо за другие советы по SQL. Вы бы порекомендовалиISNULL
илиCOALESCE
сделать данные 0 вместоNULL
? Еще раз спасибо!Когда я сталкивался с подобными проблемами в прошлом, я создал таблицу «чисел», чтобы помочь справиться с отсутствующими строками.
Я создал свою таблицу чисел специально для работы с датами:
Это создает таблицу с одной строкой для каждой даты между 1900-01-01 и 2099-12-31. Я использую,
TOP(73049)
чтобы ограничить диапазон дат, сгенерированный в моем примере, этими датами - если вы работаете с другим диапазоном дат, вы можете изменить это число.Затем я добавляю
dDates
таблицу в свой запрос, чтобы строка возвращалась для каждой даты в желаемом диапазоне для каждогоmember_id
. Результат затем присоединяется кTime_Entry
таблице как таковой:Это позволяет вам указать диапазон дат для отчета.
Вы можете дополнительно уточнить результаты, добавив
COALESCE(...)
иSUM(...)
согласно:Это приводит к следующему выводу для ваших образцов данных:
источник