Eu tenho uma mesa de pessoas que estão fazendo trabalhos por peça. Cada entrada na tabela tem um ID de usuário, nome e uma data para cada relatório inserido.
Preciso fazer um relatório semanal do que essas pessoas fizeram por dia começando no domingo
- Como agrupar por semana a partir de domingo?
- Como você faz uma coluna para cada COUNT(*) por dia?
t0001, Tod, 2015-6-29
t0001, Tod, 2015-6-29
t0001, Tod, 2015-6-29
t0001, Tod, 2015-6-29
t0001, Tod, 2015-6-29
t0001, Tod, 2015-6-28
t0001, Tod, 2015-6-28
b0002, Ben, 2015-6-29
b0002, Ben, 2015-6-29
b0002, Ben, 2015-6-28
Isto é o que estou procurando.
NAME | S | M | T | W | R | F | S | TOTAL
----------------------------------------
TOD | 2 | 5 | - | - | - | - | - | 7
BEN | 1 | 2 | - | - | - | - | - | 3
Aqui está uma maneira. Supondo esta tabela e dados de exemplo:
Em seguida, com uma variável ou parâmetro para ditar a semana de seu interesse:
Resultados:
Outra maneira:
Não se esqueça de limpar:
Você pode usar a seguinte abordagem no SQL Server para dinamizar os dados no formato que está procurando. Você também pode usar o operador PIVOT, mas prefiro escrever as instruções CASE, pois acho essa sintaxe mais clara (elas sempre resolveram o mesmo plano de consulta em todos os casos que verifiquei).
Resposta atualizada com base em Aaron apontando as deficiências com DATENAME. Obrigado por apontar isso, Aaron! Trabalhamos principalmente com bancos de dados baseados em inglês, mas essa foi obviamente uma suposição tola para ser feita de forma mais ampla.
Para referência, aqui está a resposta original (que é incorreta se não estiver em inglês!):
Você também pode considerar o uso da
DATEPART
função, mas saiba que ela depende de comoDATEFIRST
está configurada e, portanto, pode nem sempre retornar os mesmos resultados em bancos de dados diferentes ou se a configuração for alterada:Não sei se é igual no SQL Server, fiz isso no MySQL usando a
WEEKDAY
função.Tabela
UserRecords
:Consulta:
Resultado: