(PostgreSQL) 9.3.11 中的 Case 语句 COUNT for THEN

qwe*_*rty 2 sql postgresql

首先,这是一个课程作业问题,所以我不是在寻找完整的答案,只是一个提示:)

我有一个“君主”数据库,用于存储姓名、房屋(?)、登基、加冕(?),用于跟踪君主(包括首相)。宫位和加冕礼仅适用于君主,如果君主是首相,则返回 null。它看起来如下:

桌子

我需要编写一个返回scheme(house,seventeenth,eighteenth,nineteenth,twentieth)的psql查询,列出17、18、19和20世纪每个王室继承王位的君主数量,并且有添加什么内容作为我的 THEN 查询的问题。

编辑: 谢谢您的建议!我现在对我的查询做了一些更改:

 SELECT  house,
         TO_CHAR(accession, 'YYYY' ) AS accession_year,
         COUNT(CASE WHEN accession_year BETWEEN 1601 AND 1700 THEN name END) AS seventeenth,
         COUNT(CASE WHEN accession_year BETWEEN 1701 AND 1800 THEN name END) AS eighteenth,
         COUNT(CASE WHEN accession_year BETWEEN 1801 AND 1900 THEN name END) AS nineteenth,
         COUNT(CASE WHEN accession_year BETWEEN 1901 AND 2000 THEN name END) AS twentieth,
  FROM monarch
  WHERE house IS NOT NULL
  GROUP BY house
  ;
Run Code Online (Sandbox Code Playgroud)

现在 psql 告诉我 accession_year 不存在。我不想在 CASE 语句中使用完整的加入日期。如何在查询中仍然使用 TO_CHAR?

Dam*_*ver 5

单个SELECT子句中的每个表达式的计算“就好像”它与同一子句中的所有其他表达式并行计算一样。因此,它们之间不允许有任何依赖关系,因为一开始就没有可用的结果值。

一种选择是引入子查询:

SELECT  house,
         accession_year,
         COUNT(CASE WHEN accession_year BETWEEN 1601 AND 1700 THEN name END) AS seventeenth,
         COUNT(CASE WHEN accession_year BETWEEN 1701 AND 1800 THEN name END) AS eighteenth,
         COUNT(CASE WHEN accession_year BETWEEN 1801 AND 1900 THEN name END) AS nineteenth,
         COUNT(CASE WHEN accession_year BETWEEN 1901 AND 2000 THEN name END) AS twentieth,
  FROM (
     SELECT house,name,TO_CHAR(accession, 'YYYY' ) AS accession_year
     FROM monarch
     WHERE house IS NOT NULL ) AS t
  GROUP BY house
  ;
Run Code Online (Sandbox Code Playgroud)

现在您有两个单独的子句,并且允许SELECT外部子句依赖于内部子句计算的值。