我正在寻找一种动态或自动命名下面我的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有很多很多。
答案 0 :(得分:0)
您无法使用动态行大小创建查询。即使使用交叉表,这也是不可能的。
但是你可以
\crosstabview
的内容。您可以在我的问题"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或数组结构。