postgresql在case语句中动态命名列

时间:2017-05-08 19:17:24

标签: sql postgresql case transpose

我正在寻找一种动态或自动命名下面我的case语句中的列的方法。情景 - 我试图了解每个国家/地区有多少不同行业的公司。国家/地区是行,而类别是列。

我正在使用postgressql,因此我不会工作,而且我没有足够新的版本,我可以使用交叉表

我希望能够在更大的场景中复制这些内容,而我不必担心“硬编码”。 cat_nbr和列名就像我在这里做的那样。

SELECT country,
       count(CASE WHEN cat_nbr = 1 THEN company_code END) retail,
       count(CASE WHEN cat_nbr = 2 THEN company_code END) finance,
       count(CASE WHEN cat_nbr = 3 THEN company_code END) oil,
       count(CASE WHEN cat_nbr = 4 THEN company_code END) tech   
FROM global_companies  
GROUP BY country

表格结构格式如果不清除,则包含以下列:

country - cat_nbr - company_code -  cat_desc.    

Cat_desc是我硬编码零售',' finance'等的地方

在某种程度上我可以通过较少的硬编码来实现这一点,就我所说的每个cat_nbr / cat_desc而言? cat_nbrs和cat_descs有很多很多。

2 个答案:

答案 0 :(得分:0)

您无法使用动态行大小创建查询。即使使用交叉表,这也是不可能的。

但是你可以

  1. 创建一个返回SQL语句的查询,您可以在客户端中执行该语句。
  2. 使用客户端创建类似\crosstabview的内容。
  3. 您可以在我的问题"How do I generate a pivoted CROSS JOIN where the resulting table definition is unknown?"中阅读有关此内容的更多信息。

答案 1 :(得分:0)

您可以对列的国家/地区名称进行硬编码,让行像往常一样动态,而不是硬编码类别名称。

SELECT cat_nbr, 
       COUNT(CASE WHEN Country = 'US' THEN company_code END) AS NumUS,
       COUNT(CASE WHEN Country = 'UK' THEN company_code END) AS NumUK,
       COUNT(CASE WHEN Country = 'FR' THEN company_code END) AS NumFR,
       ...
FROM global_companies
GROUP BY cat_nbr;

另一种选择是您可以将数据聚合为JSON或数组结构。