2016-11-29 24 views
5

Tôi đã tìm kiếm cao và thấp trong nhiều tuần để tìm giải pháp cho vấn đề của mình.Hợp nhất các cột bắt đầu và kết thúc thành một cột

Sự cố của tôi như sau:

A có bảng có tọa độ bắt đầu và kết thúc và ngày từ nhà cung cấp dịch vụ đo từ xa trên xe.

Tôi cần hợp nhất các thành một cột để giải pháp báo cáo của chúng tôi có thể vẽ chúng.

Một số ví dụ dữ liệu như sau:

DECLARE @TblVar AS TABLE([ServiceID] INT 
        ,[StartDate] DATETIME 
        ,[StartLocation] VARCHAR(255) 
        ,[StartLat] FLOAT 
        ,[StartLong] FLOAT 
        ,[EndDate] DATETIME 
        ,[EndLocation] VARCHAR(255) 
        ,[EndLat] FLOAT 
        ,[EndLong] FLOAT); 
INSERT INTO @TblVar 

VALUES (48322, '2016-11-28 05:38:37.000','Weaver Road,Leicester',52.5753273,-1.306842,'2016-11-28 05:40:02.000','Earl Street,Leicester',52.5781,-1.3048711) 
     ,(48322, '2016-11-28 05:44:05.000','Earl Street,Leicester',52.5780996,-1.3048768,'2016-11-28 05:53:52.000','Arbor Road,Leicester',52.5533448,-1.2349645) 
     ,(48322, '2016-11-28 09:14:25.000','Arbor Road,Leicester',52.5533833,-1.2349445,'2016-11-28 09:15:54.000','Coventry Road,Leicester',52.5522865,-1.2370495) 
     ,(48322, '2016-11-28 09:16:05.000','Coventry Road,Leicester',52.552292,-1.2370598,'2016-11-28 09:20:41.000','Arbor Road,Leicester',52.553338,-1.2352033)  
     ,(48322, '2016-11-28 13:34:36.000','Arbor Road,Leicester',52.553388,-1.2352651,'2016-11-28 13:53:29.000','Narborough Road South,Leicester',52.597422,-1.1832976)  
     ,(48322, '2016-11-28 13:55:36.000','Narborough Road South,Leicester',52.597352,-1.183299,'2016-11-28 13:58:51.000','Hazel Drive,Leicester',52.6020946,-1.1760238) 
     ,(48322, '2016-11-28 14:11:53.000','Hazel Drive,Leicester',52.6020853,-1.1760053,'2016-11-28 14:24:40.000','Arbor Road,Leicester',52.5533118,-1.2352118) 
     ,(48322, '2016-11-28 14:29:48.000','Arbor Road,Leicester',52.5532741,-1.2352471,'2016-11-28 14:30:39.000','Coventry Road,Leicester',52.552955,-1.2363475) 
     ,(48322, '2016-11-28 14:32:24.000','Coventry Road,Leicester',52.552944,-1.2363491,'2016-11-28 14:34:06.000','Coventry Road,Leicester',52.5532598,-1.2350731) 
     ,(48322, '2016-11-28 14:50:12.000','Coventry Road,Leicester',52.5532646,-1.2351661,'2016-11-28 14:50:13.000','Coventry Road,Leicester',52.5532646,-1.2351661) 
     ,(48322, '2016-11-28 16:02:29.000','Coventry Road,Leicester',52.553156,-1.2348643,'2016-11-28 16:13:09.000','Earl Street,Leicester',52.5780946,-1.30486) 
     ,(48322, '2016-11-28 16:22:07.000','Earl Street,Leicester',52.5780776,-1.304851,'2016-11-28 16:23:26.000','Weaver Road,Leicester',52.5753643,-1.306814) 

nào trông như thế này:

+-----------+---------------------+---------------------------------+------------+------------+---------------------+---------------------------------+------------+------------+ 
| ServiceID |  StartDate  |   StartLocation   | StartLat | StartLong |  EndDate  |   EndLocation   | EndLat | EndLong | 
+-----------+---------------------+---------------------------------+------------+------------+---------------------+---------------------------------+------------+------------+ 
|  48322 | 28/11/2016 05:38:37 | Weaver Road,Leicester   | 52.5753273 | -1.306842 | 28/11/2016 05:40:02 | Earl Street,Leicester   | 52.5781 | -1.3048711 | 
|  48322 | 28/11/2016 05:44:05 | Earl Street,Leicester   | 52.5780996 | -1.3048768 | 28/11/2016 05:53:52 | Arbor Road,Leicester   | 52.5533448 | -1.2349645 | 
|  48322 | 28/11/2016 09:14:25 | Arbor Road,Leicester   | 52.5533833 | -1.2349445 | 28/11/2016 09:15:54 | Coventry Road,Leicester   | 52.5522865 | -1.2370495 | 
|  48322 | 28/11/2016 09:16:05 | Coventry Road,Leicester   | 52.552292 | -1.2370598 | 28/11/2016 09:20:41 | Arbor Road,Leicester   | 52.553338 | -1.2352033 | 
|  48322 | 28/11/2016 13:34:36 | Arbor Road,Leicester   | 52.553388 | -1.2352651 | 28/11/2016 13:53:29 | Narborough Road South,Leicester | 52.597422 | -1.1832976 | 
|  48322 | 28/11/2016 13:55:36 | Narborough Road South,Leicester | 52.597352 | -1.183299 | 28/11/2016 13:58:51 | Hazel Drive,Leicester   | 52.6020946 | -1.1760238 | 
|  48322 | 28/11/2016 14:11:53 | Hazel Drive,Leicester   | 52.6020853 | -1.1760053 | 28/11/2016 14:24:40 | Arbor Road,Leicester   | 52.5533118 | -1.2352118 | 
|  48322 | 28/11/2016 14:29:48 | Arbor Road,Leicester   | 52.5532741 | -1.2352471 | 28/11/2016 14:30:39 | Coventry Road,Leicester   | 52.552955 | -1.2363475 | 
|  48322 | 28/11/2016 14:32:24 | Coventry Road,Leicester   | 52.552944 | -1.2363491 | 28/11/2016 14:34:06 | Coventry Road,Leicester   | 52.5532598 | -1.2350731 | 
|  48322 | 28/11/2016 14:50:12 | Coventry Road,Leicester   | 52.5532646 | -1.2351661 | 28/11/2016 14:50:13 | Coventry Road,Leicester   | 52.5532646 | -1.2351661 | 
|  48322 | 28/11/2016 16:02:29 | Coventry Road,Leicester   | 52.553156 | -1.2348643 | 28/11/2016 16:13:09 | Earl Street,Leicester   | 52.5780946 | -1.30486 | 
|  48322 | 28/11/2016 16:22:07 | Earl Street,Leicester   | 52.5780776 | -1.304851 | 28/11/2016 16:23:26 | Weaver Road,Leicester   | 52.5753643 | -1.306814 | 
+-----------+---------------------+---------------------------------+------------+------------+---------------------+---------------------------------+------------+------------+ 

đầu ra của tôi mong muốn là như sau:

+-----------+-----------+---------------------+---------------------------------+------------+------------+ 
| ServiceID | PathOrder |  Date   |   Location    | Lattitude | Longitude | 
+-----------+-----------+---------------------+---------------------------------+------------+------------+ 
|  48322 |   1 | 28/11/2016 05:38:37 | Weaver Road,Leicester   | 52.5753273 | -1.306842 | 
|  48322 |   2 | 28/11/2016 05:40:02 | Earl Street,Leicester   | 52.5781 | -1.3048711 | 
|  48322 |   3 | 28/11/2016 05:44:05 | Earl Street,Leicester   | 52.5780996 | -1.3048768 | 
|  48322 |   4 | 28/11/2016 05:53:52 | Arbor Road,Leicester   | 52.5533448 | -1.2349645 | 
|  48322 |   5 | 28/11/2016 09:14:25 | Arbor Road,Leicester   | 52.5533833 | -1.2349445 | 
|  48322 |   6 | 28/11/2016 09:15:54 | Coventry Road,Leicester   | 52.5522865 | -1.2370495 | 
|  48322 |   7 | 28/11/2016 09:16:05 | Coventry Road,Leicester   | 52.552292 | -1.2370598 | 
|  48322 |   8 | 28/11/2016 09:20:41 | Arbor Road,Leicester   | 52.553338 | -1.2352033 | 
|  48322 |   9 | 28/11/2016 13:34:36 | Arbor Road,Leicester   | 52.553388 | -1.2352651 | 
|  48322 |  10 | 28/11/2016 13:53:29 | Narborough Road South,Leicester | 52.597422 | -1.1832976 | 
|  48322 |  11 | 28/11/2016 13:55:36 | Narborough Road South,Leicester | 52.597352 | -1.183299 | 
|  48322 |  12 | 28/11/2016 13:58:51 | Hazel Drive,Leicester   | 52.6020946 | -1.1760238 | 
|  48322 |  13 | 28/11/2016 14:11:53 | Hazel Drive,Leicester   | 52.6020853 | -1.1760053 | 
|  48322 |  14 | 28/11/2016 14:24:40 | Arbor Road,Leicester   | 52.5533118 | -1.2352118 | 
|  48322 |  15 | 28/11/2016 14:29:48 | Arbor Road,Leicester   | 52.5532741 | -1.2352471 | 
|  48322 |  16 | 28/11/2016 14:30:39 | Coventry Road,Leicester   | 52.552955 | -1.2363475 | 
|  48322 |  17 | 28/11/2016 14:32:24 | Coventry Road,Leicester   | 52.552944 | -1.2363491 | 
|  48322 |  18 | 28/11/2016 14:34:06 | Coventry Road,Leicester   | 52.5532598 | -1.2350731 | 
|  48322 |  19 | 28/11/2016 14:50:12 | Coventry Road,Leicester   | 52.5532646 | -1.2351661 | 
|  48322 |  20 | 28/11/2016 14:50:13 | Coventry Road,Leicester   | 52.5532646 | -1.2351661 | 
|  48322 |  21 | 28/11/2016 16:02:29 | Coventry Road,Leicester   | 52.553156 | -1.2348643 | 
|  48322 |  22 | 28/11/2016 16:13:09 | Earl Street,Leicester   | 52.5780946 | -1.30486 | 
|  48322 |  23 | 28/11/2016 16:22:07 | Earl Street,Leicester   | 52.5780776 | -1.304851 | 
|  48322 |  24 | 28/11/2016 16:23:26 | Weaver Road,Leicester   | 52.5753643 | -1.306814 | 
+-----------+-----------+---------------------+---------------------------------+------------+------------+ 

Bất kỳ ý tưởng/code sẽ nhận được rất nhiều.

Cảm ơn,

Dan

+0

gợi ý: Nếu bạn muốn tạo gấp đôi so với nhiều hàng, sử dụng một CROSS JOIN với một bảng có hai hàng. Sau đó, chỉ cần sử dụng câu lệnh trường hợp để chọn cột nào sẽ đi vào hàng nào. –

+0

Suy nghĩ một CTE sẽ là một cách hiệu quả hơn để làm điều đó. Sẽ câu đố trên gợi ý của bạn và đăng phát hiện của tôi. Cảm ơn! –

+0

Bạn có hai để chọn từ bây giờ :). Đây là một câu hỏi chất lượng cao - làm cho nỗ lực đăng một kịch bản thiết lập giúp việc đặt một giải pháp trở nên dễ dàng hơn nhiều! –

Trả lời

5

Bằng cách sử dụng bên dưới, bạn có thể nhận được kết quả mong muốn. Bạn có thể sử dụng Cross áp dụng với mệnh đề values.

 SELECT A.SERVICEID, 
     ROW_NUMBER() OVER(PARTITION BY A.SERVICEID ORDER BY A.SERVICEID) AS PATHORDER, 
     B.* 
FROM @TBLVAR A 
     CROSS APPLY(
     VALUES 
       ([STARTDATE],[STARTLOCATION],[STARTLAT],[STARTLONG]), 
       ([ENDDATE],[ENDLOCATION],[ENDLAT],[ENDLONG]) 
      )B(DATE, LOCATION, LATTITUDE, LONGITUD) 
+1

tuyệt vời Tôi thích nó. –

+0

@ Nick.McDermaid Cảm ơn bạn :) – Buddi

+1

Hoạt động hoàn hảo và rất thanh lịch! Không bao giờ nhìn thấy nó được thực hiện theo cách này, và chắc chắn sẽ được sử dụng phương pháp này trong tương lai !! –

0

Tôi nghĩ rằng đây là những gì bạn đang sau:

SELECT 
ServiceID, 
DENSE_RANK() OVER(
      PARTITION BY ServiceID 
      ORDER BY CASE WHEN CJ.R=1 THEN [StartDate] ELSE EndDate END) PathOrder, 
CASE WHEN CJ.R=1 THEN [StartDate] ELSE EndDate END [Date], 
CASE WHEN CJ.R=1 THEN [StartLocation] ELSE [EndLocation] END [Location], 
CASE WHEN CJ.R=1 THEN [StartLat] ELSE [EndLat] END [Lat], 
CASE WHEN CJ.R=1 THEN [StartLong] ELSE [EndLong] END [Long] 
FROM @TblVar 
CROSS JOIN 
(SELECT 1 As R UNION ALL SELECT 2) CJ 
1

Query sử dụng kết hợp như dưới đây

SELECT ServiceID, ROW_NUMBER() over (order by StartDate) AS PathOrder, StartDate AS Date, StartLocation AS Location, StartLat AS Lattitude, StartLong AS Longitude 
FROM (SELECT ServiceID, StartDate, StartLocation, StartLat, StartLong 
FROM @TblVar 
UNION ALL 
SELECT ServiceID, EndDate, EndLocation, EndLat, EndLong 
FROM TblVar AS @TblVar_1) AS q1 
+0

Vui lòng sử dụng thẻ mã và định dạng truy vấn để dễ đọc hơn. – Seb

Các vấn đề liên quan