首先,这是一个课程作业问题,所以我不是在寻找完整的答案,只是一个提示:)
我有一个“君主”数据库,用于存储姓名、房屋(?)、登基、加冕(?),用于跟踪君主(包括首相)。宫位和加冕礼仅适用于君主,如果君主是首相,则返回 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?
单个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外部子句依赖于内部子句计算的值。
| 归档时间: |
|
| 查看次数: |
21719 次 |
| 最近记录: |