如何使用枢轴?
How to use pivot?
我知道这个问题很愚蠢,但我真的无法理解枢轴的逻辑 table。
我有这个SQL代码
SELECT AddressBase.RegionName,
ObjectBase.ObjectID,
YEAR(ObjectBase.CreatedOn) AS Year
FROM ObjectBase INNER JOIN
AddressBase ON AddressBase.ObjectID = ObjectBase.ObjectID AND
AddressBase.DeleteStateCode = 0 AND
ObjectBase.DeleteStateCode = 0
有了这个
但我需要使用 pivot 来获得结果,
如何?
我尝试过类似的方法,但显然无法正常工作。
SELECT AddressBase.RegionName, [2011], [2012], [2013], [2014], [2015], [2016], [2017]
FROM
(
SELECT ObjectBase.ObjectID,
YEAR(ObjectBase.CreatedOn) yr,
AddressBase.RegionName
FROM ObjectBase INNER JOIN
AddressBase ON AddressBase.ObjectID = ObjectBase.ObjectID AND
AddressBase.DeleteStateCode = 0 AND
ObjectBase.DeleteStateCode = 0
) d
pivot
(
COUNT(ObjectBase.ObjectID)
for yr in ([2011], [2012], [2013], [2014], [2015], [2016], [2017])
) piv
1:
动态 PIVOT 使用我认为它的工作...
我刚试过
从显示你的输出图像
DECLARE @ColumnsTable TABLE ([ColumnName] VARCHAR(50));
INSERT INTO @ColumnsTable ([ColumnName])
SELECT DISTINCT '[' + CONVERT(VARCHAR(48), YEAR(ObjectBase.CreatedOn)) + ']'
FROM ObjectBase INNER JOIN
AddressBase ON AddressBase.ObjectID = ObjectBase.ObjectID AND
AddressBase.DeleteStateCode = 0 AND
ObjectBase.DeleteStateCode = 0;
DECLARE @PivotColumns VARCHAR(MAX), @TotalColumn VARCHAR(MAX), @SQL VARCHAR(MAX);
SET @PivotColumns = (SELECT STUFF((SELECT DISTINCT ', ' + CONVERT(VARCHAR(50), [ColumnName])
FROM @ColumnsTable
FOR XML PATH('')), 1, 2, ''));
SET @SQL = 'SELECT RegionName,' +@PivotColumns +'
FROM (
SELECT ObjectBase.ObjectID as ObjectID,
YEAR(ObjectBase.CreatedOn) yr,
AddressBase.RegionName as RegionName
FROM ObjectBase INNER JOIN
AddressBase ON AddressBase.ObjectID = ObjectBase.ObjectID AND
AddressBase.DeleteStateCode = 0 AND
ObjectBase.DeleteStateCode = 0) AS t
PIVOT (MAX([ObjectID])
FOR [yr] IN (' + @PivotColumns + ') ) AS p order by RegionName ';
EXEC(@SQL);
我知道这个问题很愚蠢,但我真的无法理解枢轴的逻辑 table。
我有这个SQL代码
SELECT AddressBase.RegionName,
ObjectBase.ObjectID,
YEAR(ObjectBase.CreatedOn) AS Year
FROM ObjectBase INNER JOIN
AddressBase ON AddressBase.ObjectID = ObjectBase.ObjectID AND
AddressBase.DeleteStateCode = 0 AND
ObjectBase.DeleteStateCode = 0
有了这个
但我需要使用 pivot 来获得结果,
如何?
我尝试过类似的方法,但显然无法正常工作。
SELECT AddressBase.RegionName, [2011], [2012], [2013], [2014], [2015], [2016], [2017]
FROM
(
SELECT ObjectBase.ObjectID,
YEAR(ObjectBase.CreatedOn) yr,
AddressBase.RegionName
FROM ObjectBase INNER JOIN
AddressBase ON AddressBase.ObjectID = ObjectBase.ObjectID AND
AddressBase.DeleteStateCode = 0 AND
ObjectBase.DeleteStateCode = 0
) d
pivot
(
COUNT(ObjectBase.ObjectID)
for yr in ([2011], [2012], [2013], [2014], [2015], [2016], [2017])
) piv
1:
动态 PIVOT 使用我认为它的工作... 我刚试过 从显示你的输出图像
DECLARE @ColumnsTable TABLE ([ColumnName] VARCHAR(50));
INSERT INTO @ColumnsTable ([ColumnName])
SELECT DISTINCT '[' + CONVERT(VARCHAR(48), YEAR(ObjectBase.CreatedOn)) + ']'
FROM ObjectBase INNER JOIN
AddressBase ON AddressBase.ObjectID = ObjectBase.ObjectID AND
AddressBase.DeleteStateCode = 0 AND
ObjectBase.DeleteStateCode = 0;
DECLARE @PivotColumns VARCHAR(MAX), @TotalColumn VARCHAR(MAX), @SQL VARCHAR(MAX);
SET @PivotColumns = (SELECT STUFF((SELECT DISTINCT ', ' + CONVERT(VARCHAR(50), [ColumnName])
FROM @ColumnsTable
FOR XML PATH('')), 1, 2, ''));
SET @SQL = 'SELECT RegionName,' +@PivotColumns +'
FROM (
SELECT ObjectBase.ObjectID as ObjectID,
YEAR(ObjectBase.CreatedOn) yr,
AddressBase.RegionName as RegionName
FROM ObjectBase INNER JOIN
AddressBase ON AddressBase.ObjectID = ObjectBase.ObjectID AND
AddressBase.DeleteStateCode = 0 AND
ObjectBase.DeleteStateCode = 0) AS t
PIVOT (MAX([ObjectID])
FOR [yr] IN (' + @PivotColumns + ') ) AS p order by RegionName ';
EXEC(@SQL);