将开始和结束列合并到一列
问题描述:
我已经搜索了几个星期的高和低,现在试图找到我的问题的解决方案。将开始和结束列合并到一列
我的问题是:
一个具有从车辆遥测提供起点和终点坐标和日期表。
我需要将这些合并到一个列中,以便我们的报告解决方案能够绘制它们。
一些示例数据如下:
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)
,看起来像这样:
+-----------+---------------------+---------------------------------+------------+------------+---------------------+---------------------------------+------------+------------+
| 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 |
+-----------+---------------------+---------------------------------+------------+------------+---------------------+---------------------------------+------------+------------+
我的期望输出如下:
+-----------+-----------+---------------------+---------------------------------+------------+------------+
| 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 |
+-----------+-----------+---------------------+---------------------------------+------------+------------+
任何想法/代码会大受欢迎。
感谢,
丹
答
通过使用下面你可以得到想要的结果。您可以使用Cross apply with value子句。
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)
答
我认为这是你以后:
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
答
查询使用工会像下面
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
请使用代码标签并格式化查询以获得更好的可读性。 – Seb
提示:如果您想创建两倍多行,请使用CROSS JOIN对着两行的表格。然后,只需使用case语句来选择哪些列进入哪些行。 –
正在考虑CTE会是一个更有效的方式。将困惑你的提示并发布我的发现。谢谢! –
你有两个可以选择:)。这是一个高质量的问题 - 使得发布设置脚本的努力使得构建解决方案变得更容易! –