如何使用枢轴?

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);