Подсчет разных записей в двух таблицах

Вопрос по подсчету уникальной комбинации полей в двух таблицах в SQL. MSaccess 2003.

table1: id, fld1, fld2
table2: id, dateAndTime

идентификатор не уникален; таблицы объединяются через "id".

Мне нужен подсчет по дате (дд / мм / гг - время игнорирования) различных комбинаций fld1 а также fld2 (INT).

Более конкретно, мне нужно знать, какая дата имеет наиболее четкие комбинации fld1 а также fld2,

Если таблица1 имеет

1, 101, 101
2, 101, 101
3, 101, 101
4, 101, 102
5, 101, 102
6, 101, 103

И таблица 2 имеет

1, 01.12.2010
2, 01.12.2010
3, 01.12.2010
1, 12/2/2010
2, 12/2/2010
4, 12/2/2010
5, 12/2/2010
6, 12/2/2010

я нуждаюсь

12/1/2010, 1     'only 1 unique combinatin of fld1 and fld2
12/2/2010, 3     'only 3 unique combinations of fld1 and fld2

Но мне нужен только вывод "12/2/2010, 3", так как мне просто нужны дата и счет наибольшего числа.

Не могу понять, как отформатировать это в комментариях к правильному ответу ниже - так вот это для MS Access 2003.

Select TOP 5 theDay, count(*) AS theCount 
FROM ( 
Select cdate(int(date_col)) As theDay 
From tbl1 Inner Join tbl2 on tbl1.id=tbl2.id 
Group By cdate(int(date_col)), fld1, fld2 
) As X 
Group By theDay 
Order By 2 Desc; 

Это возвращает ТОП-5 комбинаций по дате (без учета значения времени)

2 ответа

Решение

В современных СУБД вы можете рассчитывать различные комбинации за один раз:

SELECT date_col, count(DISTINCT (fld1, fld2)) AS unique_combos
FROM   tbl1
JOIN   tbl2 USING (id)
GROUP  BY date_col;

Более простой метод в два этапа, если это не сработает:

SELECT date_col, count(*) AS unique_combos
FROM  (
   SELECT date_col
   FROM   tbl1
   JOIN   tbl2 ON tbl1.id = tbl2.id
   GROUP  BY date_col, fld1, fld2
   ) AS x
GROUP  BY date_col;

Второй должен работать и в MS Access.

Что @user2184214 наконец пошел с:

SELECT TOP 5 theDay, count(*) AS theCount
FROM  (
   SELECT cdate(int(date_col)) AS theDay
   FROM   tbl1 
   JOIN   tbl2 ON tbl1.id = tbl2.id
   GROUP  BY cdate(int(date_col)), fld1, fld2
   ) AS x
GROUP  BY theDay
ORDER  BY 2 DESC;

Этот запрос дает вам то, что вы хотите:

SELECT
  date(dateAndTime) AS date,
  count(DISTINCT (fld1, fld2)) AS count
FROM table1
JOIN table2 ON table1.id = table2.id
GROUP BY 1
HAVING count(DISTINCT fld1, fld2) > 1
ORDER BY 2 DESC
Другие вопросы по тегам