SQL-код для отображения count () значения, полученного из другого столбца - PullRequest
0 голосов
/ 25 мая 2010

У меня есть три таблицы (это соответствующие столбцы):

Table1
bookingid, person, role


Table2
bookingid, projectid


Table3
projectid, project, numberofrole1, numberofrole2

Table1.role может принимать два значения: "role1" или "role2".

Я хочу показать, какие проекты не имеют правильное количество ролей в Таблице 1. Количество ролей, которое должно быть для каждой роли, приведено в Таблице 3.

Например, если Таблица1 содержит эти три строки:

bookingid, person, role
7, Tim, role1
7, Bob, role1,
7, Charles, role2

и Таблица2

bookingid, projectid
7, 1

и Таблица3

projectid, project, numberofrole1, numberofrole2
1, Test1, 2, 2

Мне бы хотелось, чтобы результаты показали, что для проекта Test1 .

указано неправильное число role2s .

Если честно, что-то вроде этого немного выходит за рамки моих возможностей, поэтому я открыт для предложений о том, как лучше всего это сделать. Я использую sqlite и php (это всего лишь небольшой проект). Я полагаю, что смогу что-то сделать с php в конце, как только получу результаты, но мне было интересно, есть ли лучший способ сделать это с помощью sqlite.

Я начал делать что-то вроде этого:

SELECT project, COUNT(numberofrole1) as "Role"
FROM Table1
JOIN Table2
USING (projectid)
JOIN Table3
USING (bookingid)
WHERE role="role1"
GROUP BY project

Но я не могу понять, как сравнить значение, возвращаемое как «Роль», со значением, полученным из numberofrole1

С благодарностью принимается любая помощь.

Ответы [ 3 ]

0 голосов
/ 25 мая 2010
SELECT * FROM
(
  SELECT 
    projectid, 
    role,
    CASE WHEN role = 'role2' THEN numberofrole2 DEFAULT numberofrole1 END numRequired,
    COUNT(*) numPresent
  FROM Table1 
  JOIN Table2 ON Table1.bookingid = Table2.bookingid
  JOIN Table3 ON Table2.projectid = Table3.projectid
  GROUP BY projectid, role
)
WHERE numRequired > numPresent
0 голосов
/ 26 мая 2010

Попробуйте что-то подобное:

SELECT
    projectid, 
    numberofrole1,
    numberofrole2,
    SUM(role='role1') as actual_numberofrole1,
    SUM(role='role2') as actual_numberofrole2
FROM table3
JOIN table2
    USING (projectid)
JOIN table1
    USING (bookingid)
GROUP BY projectid
HAVING numberofrole1 <> actual_numberofrole1
    OR numberofrole2 <> actual_numberofrole2
0 голосов
/ 25 мая 2010

попробуйте это:

Select * From Table3 t3
Where (Select Count(*) From Table1 t1r1
          Join Table2 t2r1 On t2r1.bookingid = t1r1.bookingid
       Where t2r1.projectid = t3.ProjectId
          And role = 'role1') <>  numberofrole1 
     Or
     (Select Count(*) From Table1 t1r2
          Join Table2 t2r2 On t2r2.bookingid = t1r2.bookingid
       Where t2r2.projectid = t3.ProjectId
          And role = 'role2') <>  numberofrole2

или даже лучше, если это работает ... (попробуйте)

Select * From Table3 t3
Where Exists 
      (Select * From Table1 t1r1
          Join Table2 t2r1 
               On t2r1.bookingid = t1r1.bookingid
       Where t2r1.projectid = t3.ProjectId
       Group By Role
       Having Sum(Case Role When 'role1' Then 1 Else 0 End) 
                              = t3.numberofrole1
          And Sum(Case Role When 'role2' Then 1 Else 0 End)  
                              = t3.numberofrole2 ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...