SQL PIVOT 行到矩阵中,结果为空

Posted

技术标签:

【中文标题】SQL PIVOT 行到矩阵中,结果为空【英文标题】:SQL PIVOT Rows Into Matrix With Empty Column Results 【发布时间】:2013-12-30 17:53:29 【问题描述】:

我需要将我的数据转换为可顺利用于剑道网格 (example) 的格式。此示例实际上是尝试为默认情况下不可用的单个图表条着色的 hack。如果您正确格式化数据,您可以将条形堆叠成组,并且可以为每个组着色。

我的数据需要像这样构造,第一列名称作为列标题

names               CompletedAllCourses   HasExpiredCourses   HasNotTakenCourses  HasDueCourses
-------------------------------------------------------------------------------------------
CompletedAllCourses   12                  NULL                NULL                 NULL
HasDueCourses         NULL                NULL                NULL                 4
HasExpiredCourses     NULL                8                   NULL                 NULL
HasNotTakenCourses    NULL                NULL                24                   NULL

这是我必须从 GroupedStats Table 开始的

CompletedAllCourses     12
HasDueCourses           4
HasExpiredCourses       8
HasNotTakenCourses      24

我从网上找到的示例中尝试了以下查询。

SELECT * FROM  GroupedStats
PIVOT 
(
  MAX(cnt) FOR cat IN (CompletedAllCourses, 
          HasExpiredCourses, HasNotTakenCourses, HasDueCourses)
) p

这就是结果。

CompletedAllCourses HasExpiredCourses HasNotTakenCourses HasDueCourses
------------------- ----------------- ------------------ -------------
12                  8                 24                 4

我想出了一种方法并将其发布为答案。

【问题讨论】:

【参考方案1】:

这将为您提供所需的结果,但它需要 CASE 中的硬编码文字:

  SELECT cat,
  CASE cat WHEN 'CompletedAllCourses' THEN CompletedAllCourses ELSE NULL END AS CompletedAllCourses,
  CASE cat WHEN 'HasExpiredCourses' THEN HasExpiredCourses ELSE NULL END AS HasExpiredCourses,
  CASE cat WHEN 'HasNotTakenCourses' THEN HasNotTakenCourses ELSE NULL END AS HasNotTakenCourses,
  CASE cat WHEN 'HasDueCourses' THEN HasDueCourses ELSE NULL END AS HasDueCourses
  FROM GroupedStats
  JOIN
  (
    SELECT * FROM  GroupedStats
    PIVOT 
    (
      MAX(cnt) FOR cat IN (CompletedAllCourses, 
            HasExpiredCourses, HasNotTakenCourses, HasDueCourses)
    ) p
  ) X
  ON 1 = 1

SQL Fiddle Demo

【讨论】:

【参考方案2】:

PIVOT 示例以拯救世界

我将这篇文章的这一部分移到了答案中,因为它最终对我有用。

需要另一列来解决问题,否则事情会崩溃成一个结果。

select * from 
(select cat as names, cnt, cat FROM GroupedStats) x
PIVOT 
(
MAX(cnt) FOR cat IN (CompletedAllCourses, HasExpiredCourses, 
        HasNotTakenCourses, HasDueCourses)
) p

[sql 小提琴] (http://sqlfiddle.com/#!6/8b706/3)

我得到了我想要的格式问题解决了!如果您可以添加解释,请发表评论。

names                 CompletedAllCourses HasExpiredCourses HasNotTakenCourses HasDueCourses
---------------------------------------------------------------------------------------
CompletedAllCourses    12                 NULL              NULL                 NULL
HasDueCourses          NULL               NULL              NULL                 4
HasExpiredCourses      NULL               8                 NULL                 NULL
HasNotTakenCourses     NULL               NULL              24                   NULL

【讨论】:

以上是关于SQL PIVOT 行到矩阵中,结果为空的主要内容,如果未能解决你的问题,请参考以下文章

从行到列的 SQL 结果

Sql PIVOT,如何使用 PIVOT 将结果中的 NULL 转换为值 0

SQL 中的 Pivot 语法错误,为啥我得到不正确的结果?

每个结果多行的 SQL Pivot

SQL Pivot - 查询结果垂直到水平

当行丢失时,用 Oracle SQL PIVOT 结果中的自定义值替换 NULL