postgresql在case语句中动态命名列

postgresql在case语句中动态命名列,sql,postgresql,case,transpose,Sql,Postgresql,Case,Transpose,我正在寻找一种在下面的case语句中动态或自动命名列的方法。情景——我试图找出每个国家有多少不同行业的不同公司。国家是行,类别是列 我正在使用postgressql,所以pivot无法工作,而且我没有足够新的版本可以使用交叉表 我希望能够将其复制到更大的场景中,在这些场景中,我不必像这里一样担心“硬编码”cat_nbr和列名 SELECT country, count(CASE WHEN cat_nbr = 1 THEN company_code END) retail,

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

我正在使用postgressql,所以pivot无法工作,而且我没有足够新的版本可以使用交叉表

我希望能够将其复制到更大的场景中,在这些场景中,我不必像这里一样担心“硬编码”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
是我硬编码“零售”、“金融”等词的地方


是否有某种方法可以减少硬编码,即我所指的每一个cat_nbr/cat_desc?有很多分类号和分类号。

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

但是你可以

  • 创建一个查询,该查询返回一条SQL语句,您可以随后在客户机中执行该语句
  • 使用客户端创建类似于
    \crosstabview
    的内容

  • 您可以在我的问题中阅读更多有关这方面的信息。

    您不能创建具有动态行大小的查询。这是不可能的,即使是交叉表

    但是你可以

  • 创建一个查询,该查询返回一条SQL语句,您可以随后在客户机中执行该语句
  • 使用客户端创建类似于
    \crosstabview
    的内容

  • 在我的问题中,您可以阅读有关这方面的更多信息。

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

    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或数组结构中。

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

    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或数组结构中。

    Postgresql版本?您有一个表catu_nbr?您需要创建一个函数并创建一个类似于的dinamic查询,但您将在类别表之间循环。@JuanCarlosOropeza。Cat_nbr和零售/金融一起进行。例如,类别#1=零售,#2=金融等。将发生的事情翻译成文字。版本是7s中的东西,不能精确地检查atm。但是你在一个表中有它们,或者在其他地方是常量?Postgresql版本?您有一个表catu_nbr?您需要创建一个函数并创建一个类似于的dinamic查询,但您将在类别表之间循环。@JuanCarlosOropeza。Cat_nbr和零售/金融一起进行。例如,类别#1=零售,#2=金融等。将发生的事情翻译成文字。版本是7的,不能精确地检查atm。但是你在表中有这些,或者在其他地方是恒定的?