Ao tentar atingir um Pivot
objetivo -ed para uma tabela de dados de duas linhas em uma linha, meu primeiro pensamento foi usar um arquivo Cross Apply
. Usando o Cross Apply
pode-se identificar/gerar cada uma das linhas com um nome de coluna específico derivado do id exclusivo da linha. (por exemplo, 'Lat1' e 'Lat2 para uma coluna de origem 'Latitude').
Tudo está bem quando eu uso ou INT
tipos FLOAT
de dados, mas quando tento usar um DateTime
arquivo .VALUES
DateTime
Exemplo Lat/Long/DateTime de Envio
Temos dois pontos em uma viagem de navios relatados em dois dias diferentes:
CREATE TABLE #Shipping
(
[RouteID] [INT] NOT NULL,
[Latitude] FLOAT NOT NULL,
[Longitude] FLOAT NOT NULL,
[Time] DATETIME NOT NULL
);
INSERT #Shipping(RouteID, [Latitude], [Longitude], [Time])
VALUES (1, 18.0221, -63.1206, '24-Jan-2016'),
(2, 17.8353, -62.99667, '25-Jan-2016');
CrossApply bem-sucedido
Se usarmos CrossApply
os dados das três primeiras colunas
SELECT col+cast([RouteID] as varchar(1)) new_col
, X.value
FROM #Shipping
CROSS APPLY
(
VALUES
(RouteID, 'Id')
, (Latitude, 'Lat')
, (Longitude, 'Lon')
) X (value, col)
Nossos resultados são os esperados:
Excelente!
Falha CrossApply com DateTime
Mas uma vez que adicionamos DateTime
à mistura:
SELECT col+cast([RouteID] as varchar(1)) new_col
, X.value
FROM #Shipping
CROSS APPLY
(
VALUES
(RouteID, 'Id')
, (Latitude, 'Lat')
, (Longitude, 'Lon')
, ([Time], 'Time')
) X (value, col)
todos se tornam DateTime
s
Como contornar isso se meu objetivo final é dinamizar todos os valores da tabela original em uma linha?
No resultado, a coluna de valor deve ter um tipo de dado, como sempre. O SQL Server determina o tipo usando as regras de precedência de tipo de dados (mais precisamente, a
VALUES
cláusula é umaUNION
, portanto, os tipos são correspondidos lá).Em seu primeiro exemplo, as regras de precedência fornecem uma coluna do tipo float . No segundo exemplo, é datetime .
Resolva o problema convertendo explicitamente cada valor na
VALUES
cláusula explicitamente para um tipo comum, por exemplo, varchar ou sql_variant :ou:
Observação: nem tudo pode ser convertido em sql_variant . A partir desse link:
Tudo, exceto o antigo tipo obsoleto de imagem , pode ser convertido em char ou varchar . Veja a matriz de conversão em Data Type Conversion (Database Engine) :