从 postgres sql 中的同一查询中提取水平列中的年份列和显示年份列

Extract out Year column and Display Year column in Horizontal column from the same query in postgres sql

我有这个查询 returns 对我来说是正确的结果。

SELECT distinct(companies.name),
                date_part('year', scopes.time_stamp) as fy, 
                count(def.dp_code)as answ_count     
FROM companies companies,
     scopes scopes,
     values dp,
     definition def,
     content cd 
where scopes.company_id = companies.company_id
  and scopes.scope_id=dp.scope_id
  and dp.content_id=cd.definition_id
  and def.definition_id=cd.definition_id
group by companies.name, date_part('year',scopes.time_stamp) 
ORDER BY companies.name

下面是上面查询的结果。

name          fy         count

3M Co       2002    200
3M Co       2003    100
3M Co       2004    150
3M Co       2005    160
3M Co       2006    169
AB SKF      2002    212
AB SKF      2003    214
AB SKF      2004    215
AB SKF      2005    237
AB SKF      2006    456
3i Group plc    2002    546
3i Group plc    2003    214
3i Group plc    2004    215
3i Group plc    2005    237
3i Group plc    2006    456

我需要像这样水平显示结果:

name            2002    2003    2004    2005    2006
3M Co       200 100 150 160 169
AB SKF          
3i Group plc    546 214 215 237 456

已修改查询,但我没有得到正确的 count.I 不知道如何计算 ans_count.Please 帮助我。

 SELECT
    distinct(companies.name),
    count(CASE WHEN date_part('year', scopes.time_stamp) = 2002 THEN answ_count end) AS Year1,
    count(CASE WHEN date_part('year', scopes.time_stamp) = 2003 THEN answ_count end) AS Year2,
    count(CASE WHEN date_part('year', scopes.time_stamp) = 2004 THEN answ_count end) AS Year3,
    count(CASE WHEN date_part('year', scopes.time_stamp) = 2005 THEN answ_count end) AS Year4,
    count(CASE WHEN date_part('year', scopes.time_stamp) = 2006 THEN answ_count end) AS Year5,
    count(CASE WHEN date_part('year',scopes.time_stamp) = 2007 THEN answ_count end) AS Year6,
    count(CASE WHEN date_part('year', scopes.time_stamp) = 2008 THEN answ_count end) AS Year7,
    count(CASE WHEN date_part('year', scopes.time_stamp) = 2009 THEN answ_count end) AS Year8,
     count(CASE WHEN date_part('year', scopes.time_stamp) = 2010 THEN answ_count end) AS Year9,
    count(CASE WHEN date_part('year', scopes.time_stamp) = 2011 THEN answ_count end) AS Year10, 
    count(CASE WHEN date_part('year', scopes.time_stamp) = 2012 THEN answ_count end) AS Year11,
    count(CASE WHEN date_part('year', scopes.time_stamp) = 2013 THEN answ_count end) AS Year12,
    count(CASE WHEN date_part('year', scopes.time_stamp) = 2014 THEN answ_count end) AS Year13,
    count(CASE WHEN date_part('year', scopes.time_stamp) = 2015 THEN answ_count end) AS Year14,
    count(CASE WHEN date_part('year', scopes.time_stamp) = 2016 THEN answ_count end) AS Year16
    FROM 
    companies companies,value_scopes value_scopes,dp_values dp,dp_definition def,dp_content_definition cd 
    where 
    value_scopes.company_id = companies.company_id
    and value_scopes.value_scope_id=dp.value_scope_id
    and dp.dp_content_definition_id=cd.dp_content_definition_id
    and def.dp_definition_id=cd.dp_definition_id
    and value_scopes.is_partial='f'
    group by companies.name
    ORDER BY companies.name;

现代的、明确的 JOIN 派生的 table:

select name,
       count(case when year = 2002 then 1 end) as Year2002,
       count(case when year = 2003 then 1 end) as Year2003,
       ...
       count(case when year = 2016 then 1 end) as Year2016
FROM
(
    SELECT companies.name,
           date_part('year', scopes.time_stamp) AS Year
    FROM companies companies
    JOIN value_scopes value_scopes ON value_scopes.company_id = companies.company_id
    JOIN dp_values dp ON value_scopes.value_scope_id = dp.value_scope_id
    JOIN dp_content_definition cd ON dp.dp_content_definition_id = cd.dp_content_definition_id
    JOIN dp_definition def ON def.dp_definition_id=cd.dp_definition_id
    WHERE value_scopes.is_partial = 'f'
) dt
group by name
ORDER BY name