Estou tentando obter alguns relatórios para registros de horas dos funcionários.
Temos duas tabelas especificamente para esta pergunta. Os funcionários são listados na Members
tabela e todos os dias eles inserem entradas de horas do trabalho que executaram e são armazenados na Time_Entry
tabela.
Exemplo de configuração com o SQL Fiddle: http://sqlfiddle.com/#!3/e3806/7
O resultado final que vou buscar é uma tabela que mostra TODAS as Members
listas de uma coluna e, em seguida, mostrará suas horas de soma para a data consultada nas outras colunas.
O problema parece ser que, se não houver linha na Time_Entry
tabela para um membro em particular, agora haverá linha para esse membro. Eu tentei vários tipos de junção diferentes (esquerda, direita, interna, externa, externa completa, etc.), mas nenhum parece me dar o que eu quero, o que seria (com base no último exemplo no 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
O que estou recebendo no momento em que consulta uma data específica de 11-1:
Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL
EGirsch | 1 | 11-10-2013 | 0.92 | 1
O que é correto com base na linha de entrada de tempo datada de 11/11/2013 para EGirsch, mas preciso ver zeros para os outros membros para obter relatórios e, eventualmente, um painel / relatório da Web para essas informações.
Esta é minha primeira pergunta e, enquanto eu procurava por Ingressar em consultas, etc. Sinceramente, não tenho certeza de como essa função pode ser chamada. Espero que isso não seja uma duplicata e ajude outras pessoas a tentar encontrar uma solução para problemas semelhantes.
fonte
WHERE
eAND
. Eu tinha usado aliases originalmente, mas o sqlfiddle não parecia gostar, então apenas fui para o formato completo. Obrigado pelas outras dicas SQL também. Você recomendariaISNULL
ouCOALESCE
tornaria os dados 0 em vez deNULL
? Obrigado novamente!Quando me deparei com esse tipo de problema no passado, criei uma tabela de "números" para ajudar a lidar com as linhas ausentes.
Criei minha tabela de números especificamente para lidar com datas da seguinte forma:
Isso cria uma tabela com uma única linha para cada data entre 1900-01-01 e 2099-12-31. Utilizo
TOP(73049)
para limitar o período gerado no meu exemplo a essas datas. Se você trabalha com um período diferente, pode ajustar esse número.Em seguida, adiciono a
dDates
tabela à minha consulta para que uma linha seja retornada para cada data no intervalo desejado para cadamember_id
. O resultado é então associado àTime_Entry
tabela como tal:Isso permite especificar um período para o relatório.
Você pode refinar ainda mais os resultados adicionando
COALESCE(...)
eSUM(...)
conforme:Isso resulta na seguinte saída para seus dados de amostra:
fonte