SQL 旋转 Table 动态
SQL Pivot Table dynamic
我已经很努力地了解如何在 SQL 中创建一个枢轴 table,但我做不到!
我有以下列:
link_id route_section date_1 StartHour AvJT data_source
....... ............. ....... ........... ...... ............
有 600,000 行数据。
我需要在下面的枢轴中使用它们 table;
date_1
StartHour 作为列标题
link_id
作为行标题
AvJT
作为数据
- 使用
data_source
= '1' 作为过滤器。
枢轴TABLE
Link_ID
date_1 StartHour 00001a 000002a 000003a 000004a
20/01/2014 8 456 4657 556 46576
21/01/2014 8 511 4725 601 52154
22/01/2014 8 468 4587 458 47585
23/01/2014 8 456 4657 556 46576
24/01/2014 8 456 4657 556 46576
25/01/2014 8 456 4657 556 46576
26/01/2014 8 456 4657 556 46576
我已经设法获得以下代码,这有效但只给我 date_1 作为列标题而不是另外的 StartHour,或者过滤器为 date_source = '1'。
Use [C1_20132014]
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME(Link_ID)
FROM (SELECT DISTINCT Link_ID FROM C1_May_Routes) AS Link_ID
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
N'SELECT Date_1, ' + @ColumnName + '
FROM C1_May_Routes
PIVOT(SUM(AvJT)
FOR Link_ID IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
感谢您的帮助,
亨利
在这里,您将 select 列中的值显示为数据透视表中的列
DECLARE @cols NVARCHAR (MAX)
SELECT @cols = COALESCE (@cols + ',[' + AvJT + ']', '[' + AvJT + ']')
FROM (SELECT DISTINCT AvJT FROM YourTable) PV
ORDER BY AvJT
现在转向查询
DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT * FROM
(
SELECT date_1, StartHour,AvJT, data_source
FROM YourTable
) x
PIVOT
(
-- Values in each dynamic column
SUM(data_source)
FOR AvJT IN (' + @cols + ')
) p;'
EXEC SP_EXECUTESQL @query
- Click here 查看结果
如果你想在列名不是动态的地方做,你可以做下面的查询
SELECT DATE_1,STARTHOUR,
MIN(CASE WHEN AvJT='00001a' THEN data_source END) [00001a],
MIN(CASE WHEN AvJT='00002a' THEN data_source END) [00002a],
MIN(CASE WHEN AvJT='00003a' THEN data_source END) [00003a],
MIN(CASE WHEN AvJT='00004a' THEN data_source END) [00004a]
FROM YOURTABLE
GROUP BY DATE_1,STARTHOUR
- Click here 查看结果
编辑:
我正在为您更新的问题更新。
声明一个过滤变量data_source
DECLARE @DATASOURCE VARCHAR(20) = '1'
而不是 QUOTENAME
,您可以使用另一种格式来获取数据透视表的列
DECLARE @cols NVARCHAR (MAX)
SELECT @cols = COALESCE (@cols + ',[' + Link_ID + ']', '[' + Link_ID + ']')
FROM (SELECT DISTINCT Link_ID FROM C1_May_Routes WHERE data_source=@DATASOURCE) PV
ORDER BY Link_ID
现在转向
DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT * FROM
(
-- We will select the data that has to be shown for pivoting
-- with filtered data_source
SELECT date_1, StartHour,AvJT, Link_ID
FROM C1_May_Routes
WHERE data_source = '+@DATASOURCE+'
) x
PIVOT
(
-- Values in each dynamic column
SUM(AvJT)
-- Select columns from @cols
FOR Link_ID IN (' + @cols + ')
) p;'
EXEC SP_EXECUTESQL @query
- Click here 查看结果
交叉表就是这样的。 FWIW,我建议使用比 00001a 更好的列名。为您的列名称赋予一些含义,以便它们更易于使用。
with SortedData as
(
SELECT date_1
, StartHour
, AvJT
, data_source
, ROW_NUMBER() over (partition by date_1 order by AvJT) AS RowNum
FROM YourTable
)
select date_1
, StartHour
, MAX(case when RowNum = 1 then AvJT end) as [00001a]
, MAX(case when RowNum = 2 then AvJT end) as [00002a]
, MAX(case when RowNum = 3 then AvJT end) as [00003a]
, MAX(case when RowNum = 4 then AvJT end) as [00004a]
from SortedData
我已经很努力地了解如何在 SQL 中创建一个枢轴 table,但我做不到!
我有以下列:
link_id route_section date_1 StartHour AvJT data_source
....... ............. ....... ........... ...... ............
有 600,000 行数据。
我需要在下面的枢轴中使用它们 table;
date_1
StartHour 作为列标题link_id
作为行标题AvJT
作为数据- 使用
data_source
= '1' 作为过滤器。
枢轴TABLE
Link_ID
date_1 StartHour 00001a 000002a 000003a 000004a
20/01/2014 8 456 4657 556 46576
21/01/2014 8 511 4725 601 52154
22/01/2014 8 468 4587 458 47585
23/01/2014 8 456 4657 556 46576
24/01/2014 8 456 4657 556 46576
25/01/2014 8 456 4657 556 46576
26/01/2014 8 456 4657 556 46576
我已经设法获得以下代码,这有效但只给我 date_1 作为列标题而不是另外的 StartHour,或者过滤器为 date_source = '1'。
Use [C1_20132014]
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME(Link_ID)
FROM (SELECT DISTINCT Link_ID FROM C1_May_Routes) AS Link_ID
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
N'SELECT Date_1, ' + @ColumnName + '
FROM C1_May_Routes
PIVOT(SUM(AvJT)
FOR Link_ID IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
感谢您的帮助,
亨利
在这里,您将 select 列中的值显示为数据透视表中的列
DECLARE @cols NVARCHAR (MAX)
SELECT @cols = COALESCE (@cols + ',[' + AvJT + ']', '[' + AvJT + ']')
FROM (SELECT DISTINCT AvJT FROM YourTable) PV
ORDER BY AvJT
现在转向查询
DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT * FROM
(
SELECT date_1, StartHour,AvJT, data_source
FROM YourTable
) x
PIVOT
(
-- Values in each dynamic column
SUM(data_source)
FOR AvJT IN (' + @cols + ')
) p;'
EXEC SP_EXECUTESQL @query
- Click here 查看结果
如果你想在列名不是动态的地方做,你可以做下面的查询
SELECT DATE_1,STARTHOUR,
MIN(CASE WHEN AvJT='00001a' THEN data_source END) [00001a],
MIN(CASE WHEN AvJT='00002a' THEN data_source END) [00002a],
MIN(CASE WHEN AvJT='00003a' THEN data_source END) [00003a],
MIN(CASE WHEN AvJT='00004a' THEN data_source END) [00004a]
FROM YOURTABLE
GROUP BY DATE_1,STARTHOUR
- Click here 查看结果
编辑:
我正在为您更新的问题更新。
声明一个过滤变量data_source
DECLARE @DATASOURCE VARCHAR(20) = '1'
而不是 QUOTENAME
,您可以使用另一种格式来获取数据透视表的列
DECLARE @cols NVARCHAR (MAX)
SELECT @cols = COALESCE (@cols + ',[' + Link_ID + ']', '[' + Link_ID + ']')
FROM (SELECT DISTINCT Link_ID FROM C1_May_Routes WHERE data_source=@DATASOURCE) PV
ORDER BY Link_ID
现在转向
DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT * FROM
(
-- We will select the data that has to be shown for pivoting
-- with filtered data_source
SELECT date_1, StartHour,AvJT, Link_ID
FROM C1_May_Routes
WHERE data_source = '+@DATASOURCE+'
) x
PIVOT
(
-- Values in each dynamic column
SUM(AvJT)
-- Select columns from @cols
FOR Link_ID IN (' + @cols + ')
) p;'
EXEC SP_EXECUTESQL @query
- Click here 查看结果
交叉表就是这样的。 FWIW,我建议使用比 00001a 更好的列名。为您的列名称赋予一些含义,以便它们更易于使用。
with SortedData as
(
SELECT date_1
, StartHour
, AvJT
, data_source
, ROW_NUMBER() over (partition by date_1 order by AvJT) AS RowNum
FROM YourTable
)
select date_1
, StartHour
, MAX(case when RowNum = 1 then AvJT end) as [00001a]
, MAX(case when RowNum = 2 then AvJT end) as [00002a]
, MAX(case when RowNum = 3 then AvJT end) as [00003a]
, MAX(case when RowNum = 4 then AvJT end) as [00004a]
from SortedData