【问题标题】:postgresql dynamically name columns in case statementpostgresql在case语句中动态命名列
【发布时间】:2017-05-09 09:13:06
【问题描述】:

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

我正在使用 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 的引用而言,我是否可以通过更少的硬编码来做到这一点?有很多很多的 cat_nbrs 和 cat_descs。

【问题讨论】:

  • Postgresql 版本?你有一张桌子 cat_nbr?
  • 您需要创建一个函数并创建一个类似于this 的动态查询,但您将在类别表之间循环。
  • @JuanCarlosOropeza。 Cat_nbr 和零售/金融齐头并进。例如,类别#1 = 零售,#2 = 金融等。将正在发生的事情转化为文字。版本是 7s 中的东西,无法准确检查 atm。
  • 但是你有那些在一个表中或在其他地方是不变的?

标签: sql postgresql case transpose


【解决方案1】:

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

你可以

  1. 创建一个返回 SQL 语句的查询,之后您可以在客户端中执行该语句。
  2. 与客户端创建类似\crosstabview 的内容。

您可以在我的问题"How do I generate a pivoted CROSS JOIN where the resulting table definition is unknown?" 中阅读更多相关信息。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2015-04-27
      • 2023-01-21
      • 1970-01-01
      相关资源
      最近更新 更多