Khi cố gắng đạt được Pivot
mục tiêu -ed cho bảng dữ liệu hai hàng thành một hàng, suy nghĩ đầu tiên của tôi là sử dụng a Cross Apply
. Bằng cách sử dụng, người Cross Apply
ta có thể xác định / tạo từng hàng với một tên cột cụ thể được lấy từ id duy nhất của hàng. (ví dụ: 'Lat1' và 'Lat2 cho cột nguồn' Latitude ').
Tất cả đều ổn khi tôi sử dụng INT
hoặc FLOAT
loại dữ liệu nhưng khi tôi cố gắng sử dụng DateTime
tất cả VALUES
trở thành DateTime
.
Ví dụ Vận chuyển Lat / Long / DateTime
Chúng tôi có hai điểm trong một hành trình tàu được báo cáo vào hai ngày khác nhau:
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 thành công
Nếu chúng ta sử dụng CrossApply
dữ liệu cho ba cột đầu tiên
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)
Kết quả của chúng tôi là như mong đợi:
Tuyệt quá!
Thất bại chéo với DateTime
Nhưng một khi chúng ta thêm DateTime
vào hỗn hợp:
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)
Tất cả trở thành DateTime
s
Làm thế nào một người nên làm việc xung quanh điều này nếu mục tiêu cuối cùng của tôi là xoay tất cả các giá trị từ bảng gốc thành một hàng?