Sql server 如何在SQL Server 2014中将结果从一个字段拆分为两个单独的字段
我正在尝试生成一个报告,该报告为我提供每小时、每车道、每方向的交通量 到目前为止我得到的结果:Sql server 如何在SQL Server 2014中将结果从一个字段拆分为两个单独的字段,sql-server,union-all,Sql Server,Union All,我正在尝试生成一个报告,该报告为我提供每小时、每车道、每方向的交通量 到目前为止我得到的结果: |TransDate |Hour |Lane| Direction| Count| --------------------------------------------- |2017-09-05 |1:00 | 1 | NB | 18 | --------------------------------------------- |2017-09-05 |1:0
|TransDate |Hour |Lane| Direction| Count|
---------------------------------------------
|2017-09-05 |1:00 | 1 | NB | 18 |
---------------------------------------------
|2017-09-05 |1:00 | 1 | SB | 12 |
---------------------------------------------
|2017-09-05 |1:00 | 2 | NB | 42 |
---------------------------------------------
|2017-09-05 |1:00 | 2 | SB | 31 |
---------------------------------------------
|2017-09-05 |1:00 | 3 | NB | 7 |
---------------------------------------------
|2017-09-05 |1:00 | 3 | SB | 8 |
---------------------------------------------
|TransDate |Hour |Lane| NB | SB |
----------------------------------------
|2017-09-05 |1:00 | 1 | 18| 12 |
----------------------------------------
|2017-09-05 |1:00 | 2 | 42| 31 |
----------------------------------------
|2017-09-05 |1:00 | 3 | 7| 8 |
----------------------------------------
SELECT CAST(TransDT as DATE) as 'TransDate'
,CAST(DATEPART(Hour, TransDT) as varchar) + ':00' as 'Hour'
,LaneID
,Direction
,COUNT(*) as 'NB_Count'
FROM Traffic_analysis
WHERE cast(TransDT as date) = DATEADD (DAY, -1 , cast(SYSDATETIME() as date))
AND Direction = 'NB'
GROUP BY CAST(TransDT as DATE), DATEPART(Hour, TransDT), LaneID, Direction
ORDER BY CAST(TransDT as DATE), DATEPART(Hour, TransDT), LaneID, Direction
我希望得到的结果:
|TransDate |Hour |Lane| Direction| Count|
---------------------------------------------
|2017-09-05 |1:00 | 1 | NB | 18 |
---------------------------------------------
|2017-09-05 |1:00 | 1 | SB | 12 |
---------------------------------------------
|2017-09-05 |1:00 | 2 | NB | 42 |
---------------------------------------------
|2017-09-05 |1:00 | 2 | SB | 31 |
---------------------------------------------
|2017-09-05 |1:00 | 3 | NB | 7 |
---------------------------------------------
|2017-09-05 |1:00 | 3 | SB | 8 |
---------------------------------------------
|TransDate |Hour |Lane| NB | SB |
----------------------------------------
|2017-09-05 |1:00 | 1 | 18| 12 |
----------------------------------------
|2017-09-05 |1:00 | 2 | 42| 31 |
----------------------------------------
|2017-09-05 |1:00 | 3 | 7| 8 |
----------------------------------------
SELECT CAST(TransDT as DATE) as 'TransDate'
,CAST(DATEPART(Hour, TransDT) as varchar) + ':00' as 'Hour'
,LaneID
,Direction
,COUNT(*) as 'NB_Count'
FROM Traffic_analysis
WHERE cast(TransDT as date) = DATEADD (DAY, -1 , cast(SYSDATETIME() as date))
AND Direction = 'NB'
GROUP BY CAST(TransDT as DATE), DATEPART(Hour, TransDT), LaneID, Direction
ORDER BY CAST(TransDT as DATE), DATEPART(Hour, TransDT), LaneID, Direction
到目前为止,我的方法是合并两组代码。一套用于NB方向,另一套用于SB方向
到目前为止我的代码:
|TransDate |Hour |Lane| Direction| Count|
---------------------------------------------
|2017-09-05 |1:00 | 1 | NB | 18 |
---------------------------------------------
|2017-09-05 |1:00 | 1 | SB | 12 |
---------------------------------------------
|2017-09-05 |1:00 | 2 | NB | 42 |
---------------------------------------------
|2017-09-05 |1:00 | 2 | SB | 31 |
---------------------------------------------
|2017-09-05 |1:00 | 3 | NB | 7 |
---------------------------------------------
|2017-09-05 |1:00 | 3 | SB | 8 |
---------------------------------------------
|TransDate |Hour |Lane| NB | SB |
----------------------------------------
|2017-09-05 |1:00 | 1 | 18| 12 |
----------------------------------------
|2017-09-05 |1:00 | 2 | 42| 31 |
----------------------------------------
|2017-09-05 |1:00 | 3 | 7| 8 |
----------------------------------------
SELECT CAST(TransDT as DATE) as 'TransDate'
,CAST(DATEPART(Hour, TransDT) as varchar) + ':00' as 'Hour'
,LaneID
,Direction
,COUNT(*) as 'NB_Count'
FROM Traffic_analysis
WHERE cast(TransDT as date) = DATEADD (DAY, -1 , cast(SYSDATETIME() as date))
AND Direction = 'NB'
GROUP BY CAST(TransDT as DATE), DATEPART(Hour, TransDT), LaneID, Direction
ORDER BY CAST(TransDT as DATE), DATEPART(Hour, TransDT), LaneID, Direction
这显然不是正确的方法,因为它不起作用
我的方法应该是什么,以便获得第二个表中每个方向的计数?您可以按如下方式使用pivot:
Select * from
( Select transdate, [hour], lane, direction, [count] from #transdata ) a
pivot (max([count]) for Direction in ([NB],[SB])) p
+------------+------------------+------+----+----+
| transdate | hour | lane | NB | SB |
+------------+------------------+------+----+----+
| 2017-09-05 | 01:00:00.0000000 | 1 | 18 | 12 |
| 2017-09-05 | 01:00:00.0000000 | 2 | 42 | 31 |
| 2017-09-05 | 01:00:00.0000000 | 3 | 7 | 8 |
+------------+------------------+------+----+----+
Declare @cols1 varchar(max)
Declare @query nvarchar(max)
Select @cols1 = stuff((select Distinct ','+QuoteName(Direction) from #transdata for xml path('')),1,1,'')
Select @query = ' Select * from
( Select transdate, [hour], lane, direction, [count] from #transdata ) a
pivot (max([count]) for Direction in (' + @cols1 + ')) p '
Exec sp_executeSql @query
输出如下:
Select * from
( Select transdate, [hour], lane, direction, [count] from #transdata ) a
pivot (max([count]) for Direction in ([NB],[SB])) p
+------------+------------------+------+----+----+
| transdate | hour | lane | NB | SB |
+------------+------------------+------+----+----+
| 2017-09-05 | 01:00:00.0000000 | 1 | 18 | 12 |
| 2017-09-05 | 01:00:00.0000000 | 2 | 42 | 31 |
| 2017-09-05 | 01:00:00.0000000 | 3 | 7 | 8 |
+------------+------------------+------+----+----+
Declare @cols1 varchar(max)
Declare @query nvarchar(max)
Select @cols1 = stuff((select Distinct ','+QuoteName(Direction) from #transdata for xml path('')),1,1,'')
Select @query = ' Select * from
( Select transdate, [hour], lane, direction, [count] from #transdata ) a
pivot (max([count]) for Direction in (' + @cols1 + ')) p '
Exec sp_executeSql @query
如果您有动态方向列表,则可以使用动态查询,如下所示:
Select * from
( Select transdate, [hour], lane, direction, [count] from #transdata ) a
pivot (max([count]) for Direction in ([NB],[SB])) p
+------------+------------------+------+----+----+
| transdate | hour | lane | NB | SB |
+------------+------------------+------+----+----+
| 2017-09-05 | 01:00:00.0000000 | 1 | 18 | 12 |
| 2017-09-05 | 01:00:00.0000000 | 2 | 42 | 31 |
| 2017-09-05 | 01:00:00.0000000 | 3 | 7 | 8 |
+------------+------------------+------+----+----+
Declare @cols1 varchar(max)
Declare @query nvarchar(max)
Select @cols1 = stuff((select Distinct ','+QuoteName(Direction) from #transdata for xml path('')),1,1,'')
Select @query = ' Select * from
( Select transdate, [hour], lane, direction, [count] from #transdata ) a
pivot (max([count]) for Direction in (' + @cols1 + ')) p '
Exec sp_executeSql @query
那么,我是否先将数据选择到#transdata中,然后再选择*from?在子查询中使用您的查询。。你是老大,马卡。非常感谢你。这起作用了。