2013-07-22 1 views
0
SELECT DISTINCTROW P.ID, First(I.Type) AS [First Of Type], Count(*) AS [Count Of I] 
FROM P INNER JOIN I ON P.[ID] = I.[P ID] 
GROUP BY P.ID; 

Где типы «a» и «b». Мой запрос возвратит:SQL: Запрос возвращает количество записей со специфическим значением в виде столбца

ID   First of Type   Count of I 
1   a      6 

Это замечательно, но то, что я хотел бы это:

ID   First of Type   Count of I  Count of a  Count of b 
1   a      6     2     4 

Я не могу понять, как сделать эту работу. Любая помощь приветствуется!

EDIT:

Я делаю это в Access. Мои таблицы выглядят следующим образом:

Table P 
ID   Name 
1   Alice 
2   Bob 


Table I 
ID   P ID  Type 
1   1   a 
2   1   b 
3   1   a 
4   1   b 
5   1   b 
6   1   b 
7   2   b 

И я хочу, чтобы вернуть

ID   First of Type   Count of I  Count of a  Count of b 
1   a      6     2     4 
2   b      1     0     1 

Надеется, что это имеет смысл. Я попытался использовать синтаксис «union all», но не повезло с тем, что я пытаюсь до сих пор.

+0

Пожалуйста, разместите образец структуры данных. Какие СУБД вы используете? – Learner

+0

Ну, во-первых, вы должны добавить еще 2 условия в свой выбор, а затем попробуйте использовать LEFT JOIN. –

ответ

0

Я думаю, что вы хотите что-то вроде этого:

SELECT 
    DISTINCTROW 
    P.ID, First(I.Type) AS [First Of Type], 
    Count(*) AS [Count Of I], 
    SUM(CASE P.ID WHEN 1 THEN 1 ELSE 0 END) AS [Count of Alice], 
    SUM(CASE P.ID WHEN 2 THEN 1 ELSE 0 END) AS [Count of Bob] 
FROM 
    P INNER JOIN I ON P.[ID] = I.[P ID] 
GROUP BY P.ID; 

, специфичной для доступа к тем, кто его использует:

SELECT 
    DISTINCTROW 
    P.ID, First(I.Type) AS [First Of Type], 
    Count(*) AS [Count Of I], 
    SUM(IIF (I.Type = "a", 1, 0)) AS [Count of a], 
    SUM(IIF (I.Type = "b", 1, 0)) AS [Count of b] 
FROM 
    P INNER JOIN I ON P.[ID] = I.[P ID] 
GROUP BY P.ID; 

Конечно, это только покрывает Алиса и Боб, и на самом деле не учитывает сводный запрос, который, как вам кажется, вы ищете. Я бы рекомендовал посмотреть на сводные запросы.

+0

Я рассмотрю сводный запрос - спасибо. К сожалению, похоже, что MS-Access не поддерживает оператор CASE, хотя я нашел предложение изучить инструкции IIF или SWITCH в качестве замены, поэтому я попробую их. Еще раз спасибо. – user2535309

+0

Это сработало отлично. Хотя в доступе вам необходимо: SELECT DISTINCTROW P.ID, First (I.Type) AS [First Of Type], Count (*) AS [Count Of I], SUM (IIT (I.Type = " a [, 1, 0)) AS [Count of a], SUM (Intervention.Type = "b", 1, 0)) AS [Count of b] FROM P INNER JOIN I ON P. [ ID] = I. [P ID] GROUP BY P.ID; – user2535309

+0

Отлично, я одобрил обновление. Сначала я увидел SQL и пропустил, что это Access, поэтому я использовал синтаксис SQL Server. – tlbignerd

0

Не 100%, что ваш запрашиваемый так что если вы можете объяснить немного больше, что вы хотите, что было бы полезно, но думаете, что ваш заголовок в стороне использует union all

[A query] 
union all 
[another query] 

например

SELECT DISTINCT ROW P.ID, First(I.Type) AS [First Of Type], Count(*) AS [Count Of I] 
FROM P INNER JOIN I ON P.[ID] = I.[P ID] 
GROUP BY P.ID 
union all 
SELECT COUNT(*) AS ColumnA 
FROM WHERE_EVER 
WHERE A_CONDITION; 
+0

В качестве примера я привел таблицы. Можете ли вы предложить, как я буду использовать союз для этих конкретных примеров? Я не могу правильно получить синтаксис. Можно ли ссылаться на значения из моего первого запроса во втором запросе при использовании union all? – user2535309

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