【问题标题】:SQL - Pivoting on Column and Row ValuesSQL - 以列值和行值为中心
【发布时间】:2018-04-27 18:49:10
【问题描述】:

我正在尝试在 X 和 Y 位置上旋转表格。该表格的格式类似于下面。

每一行都有一个与其行和列位置相关的值。在数据集中将忽略“AThing”和“文件名”。

因此,如果将其旋转,我们将得到:

我已经尝试了一段时间,但似乎无法弄清楚,有什么想法吗?

编辑:每个“文件名”的字段数是动态的。我已经设法使用以下方法提取列名但没有提取数据:

-- Construct List of Columns to Pivot
SELECT @PivotCols = 
STUFF(
    (SELECT ',' + QUOTENAME(FieldName) 
     FROM #Data
     GROUP BY ColPos, FieldName
     ORDER BY ColPos ASC
     FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)') 
,1,1,'')

SET @PivotQuery =
SELECT ' + @PivotCols + N' 
FROM 
(
    SELECT ColPos, FieldName
    FROM #Data
    GROUP BY ColPos, FieldName
) x
PIVOT 
(
    MIN(ColPos)
    FOR FieldName IN (' + @PivotCols + N')
) p' 

EXEC sp_executesql @PivotQuery

【问题讨论】:

    标签: sql sql-server pivot dynamic-pivot


    【解决方案1】:

    请试试这个代码:

     DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
    SET @columns = N'';
    SELECT @columns += N', p.' + QUOTENAME(FieldName)
      FROM (SELECT distinct p.FieldName FROM Tablename AS p
      ) AS x;
    SET @sql = N'
    SELECT ' + STUFF(@columns, 1, 2, '') + '
    FROM
    (
      SELECT p.Value, p.FieldName, p.RowPos
       FROM Tablename AS p
    ) AS j
    PIVOT
    (
      MAX(Value) FOR FieldName IN ('
      + STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
      + ')
    ) AS p;';
    PRINT @sql;
    EXEC sp_executesql @sql;
    

    【讨论】:

    • 列数将根据数据所属的“文件”而有所不同。使用 PIVOT,我设法提取了列名,但没有提取数据
    • 好的。我将针对动态字段名称更新我的问题。
    • 感谢您的代码,刚刚试了一下,列似乎是正确的,但是我只得到了一行不正确的值(FieldA = 700,FieldB = 800,FieldC = 900)
    • 你能不能试试其他的聚合函数,比如 min 或 count。
    • 使用 MIN 以正确的顺序得到 100,200,300 但仍然只返回单行数据
    猜你喜欢
    • 1970-01-01
    • 2017-02-05
    • 2020-03-19
    • 2016-11-25
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多