如何使用NULL创建MySQL交叉表

时间:2013-11-16 22:45:39

标签: mysql join crosstab

我有一个包含工作,公司和工资的数据库,其中包含每家公司为每个工作中的员工支付的金额。每个公司,工作和薪水都与调查相关联。我希望Survey的输出看起来像这样:

|      |Company A|Company B|Company C|
+------+---------+---------+---------+
|Job A |  34000  |  36750  |  41000  |
|Job B |  65880  |         |  67000  |
|Job C |         |  52340  |  49000  |

空单元格是Salaries表中没有与公司匹配的条目。

我无法理解我在网上看过的交叉表示例。我想我必须生成一个数据集,其中包含每个组合的一行,包括空值,如下所示:

Company A | Job A | 34000
Company A | Job B | 65880
Company A | Job C | NULL
Company B | Job A | 36750
Company B | Job B | NULL
Company B | Job C | 52340
Company C | Job A | 41000
Company C | Job B | 67000
Company C | Job C | 49000

我正在运行此查询以生成上述行,并且它正常工作:

SELECT C.companyname, J.jobtitle, S.salary FROM Companies C INNER JOIN Jobs J 
  ON (C.surveyid=J.surveyid) LEFT JOIN Salaries S
  ON (J.jobid=S.jobid and C.companyid=S.companyid)
  ORDER BY C.companyname, J.jobtitle

您可以在此处查看:http://sqlfiddle.com/#!2/91e49/12/0

现在我收到了正确的数据,如何将其转换为交叉表?

1 个答案:

答案 0 :(得分:1)

您可以在将表连接在一起后使用聚合显式创建交叉表。这使用条件聚合(即嵌套在聚合函数中的case语句)。

当您知道列的职位时,以下内容有效:

SELECT C.companyname,
       max(case when jobtitle = 'Job A' then S.salary end) as JobA,
       max(case when jobtitle = 'Job B' then S.salary end) as JobB,
       max(case when jobtitle = 'Job C' then S.salary end) as JobC
FROM Companies C INNER JOIN
     Jobs J 
     ON C.surveyid = J.surveyid JOIN
     Salaries S
     ON J.jobid = S.jobid and C.companyid = S.companyid
GROUP BY C.companyname;

如果你想编写更通用的东西,从Jobs表中读取作业标题,那么你必须将查询构造为字符串并使用prepare语句来执行它。