2012-03-28 54 views
0

我有一個user表像這樣半複雜的結果在SQL查詢中設置

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.

狀態僅僅是第eir響應

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 

我敢肯定,你可以工作,我是如何得到這些數字卻說明,詹姆斯干草有3(是的)狀態到2/3事件邀請。所以說是的是%66走出2,他說好,他只參加了出席的1/2那麼%的人說是後50%

在正確的軌道任何推會很多,因爲我在這裏感謝我無法理解這一點。

編輯:

同樣的東西很重要,是我想要的結果,包括數據庫中的每個用戶,即使他們在attendance表0行。

回答

1
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; 
+0

我得到一個不正確的syntac接近'''錯誤的線上'SUM(案件當A. [STATUS] = 3當1]' – 2012-03-28 03:00:46

+0

我糾正了錯誤..現在它的工作完全好.. – Teja 2012-03-28 03:27:27

+0

是這個一個是給我更準確的答案(即小數位)。唯一的問題是我的數據庫中有869個用戶,我只得到340行。你知道這是爲什麼嗎? – 2012-03-28 03:28:28

1

編輯:

哎呀,忘了加入的用戶:)

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 
2
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)
    • 計數,在已經說是
+0

感謝這一個工作,你也向我解釋這是很好,樂於助人。只要檢查哪一個更快。歡呼 – 2012-03-28 03:20:53

+0

我以爲你想要你的樣本中的整數。如果你想要小數點,就把它們出現的地方刪除。 – RichardTheKiwi 2012-03-28 19:54:19