Sou iniciante em programação e bancos de dados e agradeceria por alguma ajuda no cenário a seguir.
Eu uso PHP com SQL Server. Estou criando um sistema de presença de funcionários e gostaria de criar uma tabela (dinâmica) com meses como linhas e o nome de todos os dias da semana como colunas (para um ano específico). Os valores nas células serão o número do dia (1, 2, 3 ... 31).
A cor de plano de fundo da célula (já existe como coluna da tabela) declara o tipo de licença dos funcionários. A tabela tem as seguintes colunas: employee_id, leave_date, leave_type, leave_type_color
.
Eu quero alcançar um resultado como abaixo:
Obrigado.
sql-server
php
pivot
Mike T
fonte
fonte
Respostas:
A parte mais complexa disso é apenas criar o calendário nesse formato. Girar e cercar com HTML é bastante fácil. Primeiro, vamos começar com isso, sua tabela de funcionários com datas de folga.
leave_type
não parecia relevante para o problema em questão.O procedimento que criei se parece com isso (e aviso: assume
@@DATEFIRST = 7
):Resultados desta chamada:
É assim (parei na coluna do sétimo dia):
Você precisará adicionar o
<table>
/</table>
wrapper, mas aqui está a aparência da saída quando colocada entre elas e salva como HTML (e, é claro, você pode aprimorá-la ainda mais com CSS):Quando a licença cai em um fim de semana, a cor da licença supera a cor do fim de semana, mas isso é fácil de ajustar. Mude isso:
Para isso:
Para converter uma cor no formato decimal (como
65280
) em seu equivalente RGB (00FF00
), você precisa fazer um monte de manipulação. Eu consideraria armazená-lo como hexadecimal RGB em primeiro lugar, mas atualizei a solução aqui com algo semelhante a este:fonte
leave_type_color
coluna é numérica?Comece considerando o que você deseja ter como colunas, e isso é basicamente "Semana 1 Dia 1 (Dom)", "Semana 1 Dia 2 (Seg)", até "Semana 6 Dia 7 (Sábado)". Essencialmente, dia 1-42. 1º de janeiro é então "Semana 1 Dia 2" de janeiro. Vou ligar para o WeekPlusDay por enquanto.
Para descobrir onde cada um começa, considere a parte do dia da semana da data.
Seu conjunto de dados precisa incluir apenas esse valor "WeekPlusDay" e você exibirá o DayOfMonth.
fonte