【问题标题】:SQL Server: Examples of PIVOTing String dataSQL Server:透视字符串数据的示例
【发布时间】:2010-09-06 16:06:45
【问题描述】:

试图找到一些简单的 SQL Server PIVOT 示例。我发现的大多数示例都涉及计数或求和。我只想旋转一些字符串数据。例如,我有一个查询返回以下内容。

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

我想使用 PIVOT(如果可能的话)来制作这样的结果:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

PIVOT 功能甚至可以做到这一点吗?

【问题讨论】:

标签: sql-server tsql pivot


【解决方案1】:

我遇到了一种情况,我正在解析字符串,而相关字符串的前两个位置将是医疗保健索赔编码标准的字段名称。所以我会去掉字符串并获取 F4、UR 和 UQ 或诸如此类的值。对于一个用户来说,这对一个记录或几条记录来说非常棒。但是当我想查看数百条记录和所有用户的值时,它需要成为 PIVOT。这对于将大量记录导出到 Excel 来说非常棒。我收到的具体报告请求是“每次有人提交苯那君的索赔时,他们在 F4、UR 和 UQ 字段中提交的值是多少。我有一个 OUTER APPLY,它创建了 ColTitle 和下面的值字段

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )

【讨论】:

    【解决方案2】:
    With pivot_data as
    (
    select 
    action, -- grouping column
    view_edit -- spreading column
    from tbl
    )
    select action, [view], [edit]
    from   pivot_data
    pivot  ( max(view_edit) for view_edit in ([view], [edit]) ) as p;
    

    【讨论】:

      【解决方案3】:

      表设置:

      CREATE TABLE dbo.tbl (
          action VARCHAR(20) NOT NULL,
          view_edit VARCHAR(20) NOT NULL
      );
      
      INSERT INTO dbo.tbl (action, view_edit)
      VALUES ('Action1', 'VIEW'),
             ('Action1', 'EDIT'),
             ('Action2', 'VIEW'),
             ('Action3', 'VIEW'),
             ('Action3', 'EDIT');
      

      您的餐桌: SELECT action, view_edit FROM dbo.tbl


      不使用 PIVOT 进行查询:

      SELECT Action, 
      [View] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'VIEW'),
      [Edit] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'EDIT')
      FROM tbl t
      GROUP BY Action
      

      使用 PIVOT 查询:

      SELECT [Action], [View], [Edit] FROM
      (SELECT [Action], view_edit FROM tbl) AS t1 
      PIVOT (MAX(view_edit) FOR view_edit IN ([View], [Edit]) ) AS t2
      

      两个查询结果:

      【讨论】:

      • 感谢您提供这个罕见而清晰的答案。它立即显示了一个示例和生成的数据集
      • 我知道这已经过时了,但这是我见过的最清晰、插图最好的枢轴演示。
      【解决方案4】:

      来自http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/

      SELECT CUST, PRODUCT, QTY
      FROM Product) up
      PIVOT
      ( SUM(QTY) FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)) AS pvt) p
      UNPIVOT
      (QTY FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)
      ) AS Unpvt
      GO
      

      【讨论】:

      • 第一个产品之后的额外括号)
      【解决方案5】:

      如果您特别想使用 SQL Server PIVOT 函数,那么这应该可以工作,假设您的两个原始列称为 act 和 cmd。 (虽然看起来不那么漂亮。)

      SELECT act AS 'Action', [View] as 'View', [Edit] as 'Edit'
      FROM (
          SELECT act, cmd FROM data
      ) AS src
      PIVOT (
          MAX(cmd) FOR cmd IN ([View], [Edit])
      ) AS pvt
      

      【讨论】:

        【解决方案6】:

        请记住,MAX 聚合函数适用于文本和数字。此查询只需要扫描一次表。

        SELECT Action,
               MAX( CASE data WHEN 'View' THEN data ELSE '' END ) ViewCol, 
               MAX( CASE data WHEN 'Edit' THEN data ELSE '' END ) EditCol
         FROM t
         GROUP BY Action
        

        【讨论】:

        • +1 伙计……你真是个天才。我希望我能早点知道这一点,而不必学习如何 PIVOT!
        • @Silmaril89 假设有问题的第二列名称是“数据”,第一列是“操作”
        • 我有什么理由不应该使用...ELSE NULL END... 而不是...ELSE '' END...
        • 哪个更快,这个还是 PIVOT?
        • 哇,你简直让我大吃一惊。在我的脑后,我想到了我认为 SQL 服务器“应该只做 darnit!”的想法,但认为它做不到。然后,我看到了这个。
        【解决方案7】:

        好吧,对于您的样本和任何唯一列数量有限的样本,应该这样做。

        select 
            distinct a,
            (select distinct t2.b  from t t2  where t1.a=t2.a and t2.b='VIEW'),
            (select distinct t2.b from t t2  where t1.a=t2.a and t2.b='EDIT')
        from t t1
        

        【讨论】:

          猜你喜欢
          • 2019-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-23
          相关资源
          最近更新 更多