【问题标题】:Advanced convert rows to columns (pivot) in SQL ServerSQL Server 中的高级将行转换为列(数据透视)
【发布时间】:2021-08-19 11:33:14
【问题描述】:

我有这张桌子:

   ---------------------------------------
   | Id | worker | workStation   | amount 
   ---------------------------------------
   | 1  | John   | Suspension    |  5
   | 2  | John   | Wheels        |  8
   | 3  | Peter  | Wheels        |  1
   | 4  | Peter  | Engines       |  2
   ---------------------------------------

我需要一个查询来显示:

   -------------------------------------------
   | worker  | Suspension | Wheels | Engines
   -------------------------------------------
   | John    |     5      |   8    |   NULL
   | Peter   |     NULL   |   1    |   2
   -------------------------------------------

借助 Efficiently convert rows to columns in sql serverhttps://docs.microsoft.com/es-es/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-ver15(主要是第一个)我实现了:

   ---------------------------------
   | Suspension |  Wheels| Engines
   ---------------------------------
   |     5      |   8    |   NULL
   |     NULL   |   1    |   2
   ---------------------------------

这几乎是我需要的,但我仍然缺少知道工人姓名的列。

我需要查询以未知数量的工作站为中心。 我的代码是:

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

select @cols =  STUFF((SELECT ',' + QUOTENAME(workStation)
                    FROM TableName
                    group by workStation
                    ORDER BY workStation
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = N'SELECT ' + @cols + N' from 
             (
                SELECT amount, worker, workStation
                FROM TableName
            ) x
            pivot 
            (
                max(amount)
                for workStationin (' + @cols + N')
            ) p '

exec sp_executesql @query;

我怎样才能得到这个缺失的列? 非常感谢您。

【问题讨论】:

  • 您刚刚错过了动态声明中的worker 列。如果应该在您的SELECTs 中。如果您不要求,则不会返回列。调试动态语句的最简单方法是PRINT/SELECT 它,在那里解决问题,然后传播解决方案。如果您 PRINT 您的动态语句,您将很快看到需要将列 Worker 放入语句中的位置,以及需要将其放入动态语句中的位置。
  • 我不太明白PRINT 我的动态声明是什么意思。你的意思是我应该添加PRINT @query?我唯一看到的是我已经在使用的代码。
  • 字面意思是我所说的。 PRINT @query;/SELECT @query;这将为您提供正在执行的动态语句。
  • 谢谢!它工作正常,我得到了需要更改SELECT @query 的查询,但这样做不是动态的。当我试图在原版中实现它时,我得到了已经有效的this answer。我将使用这些命令来解决未来的问题!

标签: sql sql-server select pivot rows


【解决方案1】:

您可以选择工作人员,如果您不想要重复的行,您可以按工作人员分组

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

select @cols =  STUFF((SELECT ',' + QUOTENAME(workStation)
                FROM TableName
                group by workStation
                ORDER BY workStation
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

set @query = N'SELECT worker,' + @cols + N' from 
         (
            SELECT amount, worker, workStation
            FROM TableName
        ) x
        pivot 
        (
            max(amount)
            for workStationin (' + @cols + N')
        ) p '

exec sp_executesql @query;

【讨论】:

    猜你喜欢
    • 2023-01-03
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多