查询与count子查询,内部联接和组

Rob*_*urt 7 sql postgresql group-by subquery

我绝对是SQL的菜鸟,我一直在用Postgresql中的以下表结构编写一个复杂的查询:

CREATE TABLE reports
(
  reportid character varying(20) NOT NULL,
  userid integer NOT NULL,
  reporttype character varying(40) NOT NULL,  
)

CREATE TABLE users
(
  userid serial NOT NULL,
  username character varying(20) NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)

查询的目标是获取每个用户的报告类型数量并将其显示在一列中.有三种不同类型的报告.

使用group-by的简单查询将解决问题,但将其显示在不同的行中:

select count(*) as Amount,
       u.username,
       r.reporttype 
from reports r,
     users u 
where r.userid=u.userid 
group by u.username,r.reporttype 
order by u.username
Run Code Online (Sandbox Code Playgroud)

Mag*_*nus 17

SELECT
  username,
  (
  SELECT 
    COUNT(*)
  FROM reports 
  WHERE users.userid = reports.userid && reports.reporttype = 'Type1'
  ) As Type1,
  (
  SELECT 
    COUNT(*)
  FROM reports 
  WHERE users.userid = reports.userid && reports.reporttype = 'Type2'
  ) As Type2,
  (
  SELECT 
    COUNT(*)
  FROM reports 
  WHERE users.userid = reports.userid && reports.reporttype = 'Type3'
  ) As Type3
FROM
  users
WHERE 
  EXISTS(
    SELECT 
      NULL
    FROM 
      reports
    WHERE 
       users.userid = reports.userid
  )
Run Code Online (Sandbox Code Playgroud)


And*_*y M 7

SELECT
  u.username,
  COUNT(CASE r.reporttype WHEN 1 THEN 1 END) AS type1Qty,
  COUNT(CASE r.reporttype WHEN 2 THEN 1 END) AS type2Qty,
  COUNT(CASE r.reporttype WHEN 3 THEN 1 END) AS type3Qty
FROM reports r
  INNER JOIN users u ON r.userid = u.userid 
GROUP BY u.username
Run Code Online (Sandbox Code Playgroud)

如果服务器的SQL方言要求CASE表达式中包含ELSE分支,则ELSE NULL在every之前添加END