Criei um programa que converte uma planilha do Excel contendo a agenda dos meus departamentos em uma tabela SQL. Sempre trabalhamos em duplas, então quero poder verificar todos os meus turnos e com qual pessoa trabalharei nesses turnos.
A estrutura da tabela é: onde T, K e N são os diferentes turnos:
Semana | Data | Jim | Chade | Ernest | Rogier |
---|---|---|---|---|---|
10 | 2025-04-14 | T | K | N | T |
10 | 2025-04-15 | K | K | N | T |
10 | 2025-04-16 | N | K | N | T |
10 | 2025-04-17 | N | K | N | T |
Se eu fosse Jim na tabela acima, gostaria de obter uma resposta para 2025-04-14 como:
Semana | Data | Jim | Rogier |
---|---|---|---|
10 | 2025-04-14 | T | T |
E para 2025-04-15 como:
Semana | Data | Jim | Chade |
---|---|---|---|
10 | 2025-04-15 | K | K |
Sinceramente, não tenho a mínima ideia de como fazer algo assim. Só fiz consultas SQL bem básicas antes, como encontrar todas as linhas em que X é igual a Y.
O SQL não é realmente voltado para manipulação dinâmica de colunas.
Uma abordagem sugerida nos comentários é mostrar
null
s para as pessoas que não compartilham um turno com Jim, usando umacase
expressãoUma solução um pouco melhor (na minha humilde opinião) é usar uma
case
expressão para exibir o nome da pessoa que divide o turno com Jim:Mas, em última análise, ambas são soluções alternativas para um design de tabela que não esteja suficientemente normalizado.
Uma abordagem mais idiomática seria ter uma linha na tabela para o turno de cada pessoa (ou seja, suas colunas seriam
week
,date
,shift
ename
) e, em seguida, autojuntar a tabela:Não tenho 100% de certeza sobre isso, mas verifiquei com um CTE e funcionou para os casos de amostra que você forneceu. Espero que funcione para você tão bem quanto