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?在子查询中使用您的查询。。你是老大,马卡。非常感谢你。这起作用了。