2013-08-27 5 views
3

Таблица 1:SQL запросов - Получение числа из двух столбцов из двух таблиц

TicketNumber | Rules 
--------------------------- 
PR123  | rule_123 
PR123  | rule_234 
PR123  | rule_456 
PR999  | rule_abc 
PR999  | rule_xyz 

Table2:

TicketNumber | Rules 
--------------------------- 
PR123  | rule_123 
PR123  | rule_234 
PR999  | rule_abc 

Примечание: Обе таблицы имеют одинаковую структуру: одинаковые имена столбцов, но разные сосчитать.

Примечание: Обе таблицы имеют одинаковый набор TicketNumber значений

Случай 1: Если мне нужен билет и правила подсчет каждого билета из table1, запрос:

Select [TicketNo], COUNT([TicketNo]) AS Rules_Count from [Table1] group by TicketNo 

Это даст мне выход в формате:

ticketNumber | Rules_Count 
--------------------------- 
PR123  | 3 
PR999  | 9 

Случай 2: (Нужна помощь с этим)

Теперь предыдущий запрос получает билет и счет билета только 1 таблицы. Мне нужен счет того же билета (так как оба имеют одинаковый набор tkt nos) в таблице2.

мне нужно привести таким образом:

ticketNumber | Count(ticketNumber) of table1 | Count(ticketNumber) of table2 
--------------------------------------------------------------------------------- 
PR123  | 3     | 2 
PR999  | 2     | 1 

Оба Table1 и table2 имеют одинаковый набор билет н.у.к., но разных подсчетов

Как я получить результат, как показано выше?

+0

Я удалил тег MySQL, потому что синтаксис предлагает SQL Server. –

ответ

7

простое решение от «точки заявления зрения» (без COALESCE что, возможно, это не так легко понять)

Обратите внимание на выступления:.

Select T1.TicketNumber,T1.Rules_Count_1,T2.Rules_Count_2 
FROM 
(
    Select [TicketNumber], COUNT([TicketNumber]) AS Rules_Count_1 
    from [Table1] T1 
    group by TicketNumber) T1 
INNER JOIN 
(
    Select [TicketNumber], COUNT([TicketNumber]) AS Rules_Count_2 
    from [Table2] T2 
    group by TicketNumber 
) T2 
on T1.TicketNumber = T2.TicketNumber 

SQL Fiddle Demo

+0

Работает как очарование! Огромное спасибо! – Sabz

+0

В любом случае, InnerJoin означает, что count (table1) должен быть> чем count (table2) вправо? Что, если его разные? – Sabz

+0

Внутреннее соединение означает «хранить только строки, присутствующие в обеих таблицах, и присоединяться к ним». Таким образом, если вы поместите строку с TicketNumberX в Таблице 1 и 42 строки с TicketNumberX в Таблице 2, она должна работать одинаково. Но если вы поместите 0 строк с TicketNumberX в Table2, вы никогда не получите соединение. –

2

Вы можете сделать это с помощью full outer join после агрегации (или внутреннее соединение, если вы действительно знаете, что обе таблицы имеют одинаковые билеты:

select coalesce(t1.TicketNo, t2.TicketNo) as TicketNo, 
     coalesce(t1.Rules_Count, 0) as t1_Rules_Count, 
     coalesce(t2.Rules_Count, 0) as t2_Rules_Count 
from (Select [TicketNo], COUNT([TicketNo]) AS Rules_Count 
     from [Table1] 
     group by TicketNo 
    ) t1 full outer join 
    (Select [TicketNo], COUNT([TicketNo]) AS Rules_Count 
     from [Table2] 
     group by TicketNo 
    ) t2 
    on t1.TicketNo = t2.TicketNo; 
+0

Спасибо, Гордон, ваш запрос работает отлично. Однако внешнее соединение означает, что таблица2 должна содержать больше count than table1 вправо? Что делать, если подсчеты меняются? – Sabz

+0

@sabz. , , Полное внешнее соединение возвращает все строки из обеих таблиц. Вы можете думать о 'left external join' или' right external join'. –

0
SELECT A.center, 
     A.total_1st, 
     B.total_2nd 
FROM (SELECT a.center, 
       Count (a.dose1) AS Total_1st 
     FROM table_1 a 
     GROUP BY a.center) A 
     INNER JOIN (SELECT b.center, 
          Count (b.dose2) AS Total_2nd 
        FROM table_2 b 
        GROUP BY b.center) B 
       ON a.center = b.center 
ORDER BY A.center 
Смежные вопросы