2012-11-30 2 views
-1

Возможный дубликат:
SQL Combine Four queries into 1Multiple Count() в 1 SQL запросов

Попробую задать этот другой путь.

Может ли кто-нибудь помочь мне с функцией COUNT (*)?

мне нужно сделать следующие SQL запросов:

SELECT  COUNT(users_rewards.reward_id) AS NumberOfRewards 
FROM  users_rewards, users_codes 
WHERE  redeemed = 0 
AND  users_rewards.company_id = users_codes.company_id 
AND  email = "[email protected]" 
GROUP BY users_codes.company_id 

SELECT  COUNT(users_survey_answers.ultimate_survey_code) AS NumberOfSurveys 
FROM  users_survey_answers, users_codes 
WHERE  completed = 0 
AND  users_survey_answers.company_id = users_codes.company_id 
AND  email = "[email protected]" 
GROUP BY users_codes.company_id 

SELECT  company_name AS CompanyName 
FROM  users_codes, company 
WHERE  scanned = 1 
AND  users_codes.company_id = company.company_id 
AND  email = "[email protected]" 

SELECT  pts AS CompanyPts 
FROM  users_pts, users_codes 
WHERE  users_codes.company_id = users_pts.company_id 
AND  email = "[email protected]" 

Это выборочные данные и вывод, что мои запросы нужно сделать:

User_codes 
CompanyName Company_id scanned email 
Potbelly 1   1  [email protected] 
Chipotle 2   1  [email protected] 

Company 
Company_id 
1 
2 

Users_pts 
Company_id Pts Email 
1   20 [email protected] 
2   35 [email protected] 

Users_rewards 
Company_id Reward_id Redeemed Email 
1   1   0   [email protected] 
2   2   0   [email protected] 

Users_survey_answers 
Company_id Ultimate_survey_code Completed Email 
1   G      1   [email protected] 
2   H      0   [email protected] 

I would like this output: 

CompanyName Pts NumberOfSurveys  NumberOfRewards 
Potbelly 20 0     1 
Chipotle 35 1     1 

Я надеюсь, что это помогает. Спасибо,

+0

Какая СУБД (sql-server, mysql, oracle, ...) вы используете? На каких таблицах находятся ваши столбцы? Почему вы выполняете «GROUP BY», но не показываете столбцы, которые используются для группировки? Всегда ли записи в 'usa' и' ur', или они являются необязательными? –

+0

Не могли бы вы дать нам образцы таблиц и желаемых результатов? Есть как минимум два разных возможных способа интерпретировать это. Кроме того, рекомендуется всегда указывать ваши соединения, не использовать синтаксис implicit-join (разделяемый запятой 'FROM'). –

+0

Да, я редактирую вопрос прямо сейчас и предоставит желаемый результат. – user1025013

ответ

1

Вы можете просто использовать вложенный выберите

SELECT 
(
SELECT  COUNT(ur.ri) 
FROM  ur, uc 
WHERE  redeemed = 0 
AND  ur.ci = uc.ci 
AND  e = "test" 
GROUP BY uc.ci 
) as ur, 
(
SELECT  COUNT(usa.usc) 
FROM  usa, uc 
WHERE  completed = 0 
AND  usa.ci = uc.ci 
AND  e = "test" 
GROUP BY uc.ci 
) as usa 
+1

Зависит от СУБД, не все из них разрешают запросы без предложений FROM. Кроме того, я не совсем уверен, что это то, что делает OP. –

0

Вы можете использовать UNION ALL с новой колонки, с указанием, из которого запрос граф является, например, так:

SELECT  COUNT(ur.ri) "Count", "ri" FromWhich 
FROM  ur, uc 
WHERE  redeemed = 0 
AND  ur.ci = uc.ci 
AND  e = "test" 
GROUP BY uc.ci 
UNION ALL 
SELECT  COUNT(usa.usc), "usc" 
FROM  usa, uc 
WHERE  completed = 0 
AND  usa.ci = uc.ci 
AND  e = "test" 
GROUP BY uc.ci 
+0

У меня такое чувство, что OP на самом деле ищет «LEFT JOIN's», но не указала достаточно информации, чтобы быть уверенным ... –

+0

@ Clockwork-Muse - Да, нам не хватает информации. Если ОП объяснил больше, что он пытается сделать с структурами таблиц, может быть, есть лучший способ сделать это. Но в соответствии с текущей информацией, которую он предоставляет, я думаю, это то, что он ищет. –

0

Предположительно, вы хотите объединить их с полными внешними соединениями:

select coalesce(ucr.ci, uca.ci) as ci, ura.ur_cnt, uca.usa_cnt 
from (SELECT uc.ci, COUNT(ur.ri) as ur_cnt 
     FROM ur join 
      uc 
      on ur.ci = uc.ci 
     WHERE  redeemed = 0 AND e = "test" 
     GROUP BY uc.ci 
    ) ucr full outer join 
    (SELECT uc.ci, COUNT(usa.usc) as usa_cnt 
     FROM usa join 
      uc 
      on usa.ci = uc.ci 
     WHERE completed = 0 AND e = "test" 
     GROUP BY uc.ci 
    ) uca 
    on ucr.ci = uca.ci 

T он объединяет подзапросы, основанные на поле «ci», которое должно быть общим для двух таблиц. Как указано в комментариях, неясно, зачем вам нужны два списка чисел без идентификационных ИИ. Эта версия предполагает, что вы хотите, чтобы соответствующие подсчеты совпадали с одной и той же строкой.

Смежные вопросы