Подсчет разных записей в двух таблицах
Вопрос по подсчету уникальной комбинации полей в двух таблицах в 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