繁体   English   中英

SQL查询中的半复杂结果集

[英]Semi-complicated result set in sql query

我有这样的user

FIRSTNAME  |  LASTNAME  |  ID  |
--------------------------------
James      |  Hay       |  1   |
Other      |  Person    |  2   |

我也有这样的attendance

EVENTID  |  USERID  |  ATTENDANCE  |  STATUS  |
-----------------------------------------------
1           1          True           3
2           1          False          1
3           1          False          3
1           2          False          1
2           2          True           3
3           2          True           3

基本上,当邀请用户参加活动时,会在attendance表中添加一行,该行具有事件ID,其用户ID,错误出席率和状态0。

状态只是他们反应的指标

0 = No Response
1 = Said No
2 = Said Yes
3 = Said yes and seats confirmed

我想从查询这两个表中得到的最终结果非常复杂,我无法弄清楚该怎么做。

我想得到这样的结果

NAME          |  % of saying YES to an RSVP  | % of attending after saying yes
-------------------------------------------------------------------------------
James Hay     |             66               |                50
Other Person  |             66               |                100

我确定您可以算出这些数字的获得方式,但请解释一下,James Hay的2(3)个活动的邀请率为3(是)。 所以说“是”的百分比是66。在他说“是”的2个指标中,他只参加了1/2,所以说“是”之后的出席百分比是50%

由于我无法直言不讳,因此在正确的轨道上进行任何推动将不胜感激。

编辑:

同样非常重要的一点是,我希望结果包含数据库中的每个用户,即使他们的attendance表中有0行。

select
u.firstname, u.lastname
-- said yes, as percentage
,floor(100.0
    * count(case when a.status in (2,3) then 1 end)
    / count(u.id)) yes
-- attended after saying yes, as percentage
,floor(100.0
    * count(case when a.status in (2,3) and attendance='true' then 1 end)
    / nullif(count(case when a.status in (2,3) then 1 end),0)) attendance
--,count(u.id) rsvp -- total invites
from users u
left join attendance a on a.userid = u.id
group by u.firstname, u.lastname

注意:对于特殊情况(用户从未收到邀请),统计信息显示为0%和NULL。

术语解释:

  • count(case when a.status in (2,3) then 1 end)
    • 代表他们说了多少次,使用了两次
  • count(u.id)
    • 收到了多少邀请(在出席中记录)。 特殊情况是他们什么都没有收到,在这种情况下,LEFT JOIN使其为1 (不重要)
  • count(case when a.status in (2,3) and attendance='true' then 1 end)
    • 在回答“是”之后,他们参加了多少次
SELECT A.NAME,B.PERCENTAGE_YES_RSVP,B.PERCENTAGE_AFTER_YES
FROM 
( 
  SELECT U.ID AS ID,U.FIRSTNAME+''+U.LASTNAME AS NAME
  FROM USERS U
) A,
(
  SELECT A.USERID,A.PERCENTAGE_YES_RSVP,B.PERCENTAGE_AFTER_YES
FROM   
  (
    SELECT B.USERID,ROUND((CAST(B.COUNT_YES_RSVP AS FLOAT)/B.TOTAL_COUNT)*100,0) AS PERCENTAGE_YES_RSVP    
    FROM  
    (SELECT A.USERID,
       SUM(CASE WHEN A.STATUS=3 THEN 1 END)AS COUNT_YES_RSVP,
       COUNT(*) AS TOTAL_COUNT
       FROM ATTENDANCE A  
       GROUP BY A.USERID
     ) B
  ) A,  
(
  SELECT C.USERID,(CAST(C.COUNT_AFTER_YES_RSVP AS FLOAT)/C.TOTAL_COUNT)*100 AS PERCENTAGE_AFTER_YES   
  FROM  
  (SELECT A.USERID,
       SUM(CASE WHEN A.STATUS=3 AND A.ATTENDANCE='TRUE' THEN 1 END)AS COUNT_AFTER_YES_RSVP,
       SUM(CASE WHEN A.STATUS=3 THEN 1 END) AS TOTAL_COUNT
   FROM ATTENDANCE A  
   GROUP BY A.USERID
   ) C
)B   
WHERE A.USERID=B.USERID
) B
WHERE A.ID = B.USERID;

编辑:

糟糕,忘记加入用户了:)

select firstname, lastname,
  convert(decimal (5, 2), 1. * count(case when status in (2, 3) then 1 end) / count(*) * 100) SaidYes,
  convert(decimal (5, 2), 1. * count(case when status in (2, 3) and attendance = 'True' then 1 end) / count(case when status in (2, 3) then 1 end) * 100) ActuallyAttended
from attendance a
join users u on a.userid = u.id
group by firstname, lastname

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM