Eu tenho uma mesa assim
EU IA | Período Mês | 01 | 02 | Código do Empregado |
---|---|---|---|---|
1 | 202401 | E | eu | 005678 |
2 | 202401 | S1 | M | 005679 |
Com período, o mês está em aaaamm e 01 02 representa o dia da data.
Eu quero fazer o formato seria assim
Resultado esperado:
Código do Empregado | Período Mês | Data | Valor |
---|---|---|---|
005678 | 202401 | 2024-01-01 | E |
005678 | 202401 | 2024-01-02 | eu |
005679 | 202401 | 2024-01-01 | S1 |
005679 | 202401 | 2024-01-02 | M |
Com esta consulta
SELECT
[Employee Code],
[Period Month],
-- Menyusun tanggal berdasarkan kolom tanggal (01, 02, ..., 31) sesuai dengan 'Period Month'
CASE
WHEN [Date] = '01' AND TRY_CAST(CAST([Period Month] AS CHAR(4)) + '-01' AS DATE) IS NOT NULL THEN CAST(CAST([Period Month] AS CHAR(4)) + '-01' AS DATE)
WHEN [Date] = '02' AND TRY_CAST(CAST([Period Month] AS CHAR(4)) + '-02' AS DATE) IS NOT NULL THEN CAST(CAST([Period Month] AS CHAR(4)) + '-02' AS DATE)
END AS [Date],
[Value]
FROM
(SELECT [Employee Code], [Period Month],
[01], [02]
FROM CTE1) AS SourceTable
UNPIVOT
([Value] FOR [Date] IN
([01], [02])) AS UnpivotedTable
ORDER BY [Employee Code], [Period Month], [Date];
Mas ele retorna assim:
Código do Empregado | Período Mês | Data | Valor |
---|---|---|---|
005678 | 202401 | NULO | E |
005678 | 202401 | NULO | eu |
005679 | 202401 | NULO | S1 |
005679 | 202401 | NULO | M |
Você está tentando CAST
2024-01
em uma data - mas essa não é uma data válida. Você precisa manter tudo de[Period Month]
e remover o-
(porque senão você tem202401-01
que também não é válido) então você está CAST20240101
em uma data - que é válida. Então você pode remover oCASE
inserindo diretamente a[Date]
coluna, por exemploSe você construir o resultado desejado aos poucos, será fácil identificar em que ponto ele não está funcionando como você esperava.