Форум: "Базы";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
ВнизSQL-запрос на выборку данных из разных таблиц Найти похожие ветки
← →
Karlson (2004-01-26 19:37) [0]Здравствуйте! Такая ситуация: есть Таблица 1, Таблица 2, Таблица 3, таблицы 1 и 2 связаны по полю место, таблицы 1 и 3 - отдел. Необходимо выбрать следующую информацию и в таком виде из этих таблиц:
место отдел 1 отдел 2 ... отдел н
место 1 количество ... количество
место 2
...
место н
где количество - это количество записей в таблице 1 с номером соответствующего отдела и места
Помогите, пожалуйста.
Такой запрос дублирует записи из таблицы 2:
select c.name as typ, b.rvdk_name, count (a.id) as coun from osnovni a, treasuries b, types c
where (a.treasury = b.id)and(a.types = c.id)
group by b.rvdk_name, c.name
← →
ЮЮ (2004-01-27 03:27) [1]Странно, в запросе выбираем три поля, в том что надо - N + 1
В запросе osnovni treasuries types, в вопросе Таблица 1, Таблица 2, Таблица 3
Далее, таблицы 1 и 2 связаны по полю место, таблицы 1 и 3 - отдел. А тип связи? Если 1 и 2 связаны как 1:N, а 1 и 3 как 1:N, то запрос правильный, если же связи M:N, то количество записей из Т2 будет умножаться на количество записей в T3.
Короче, информации мало для правильного ответа.
Включаем, как всегда, чтение мыслей на расстоянии :-)
Учитывая, что ты все-таки подсчет ведешь в osnovni, выполни сначала
SELECT treasury, type, COUNT(id) cnt from osnovni GROUP BY treasury, type
Здесь, надеюсь, итоги правильные.
А теперь подклячи treasuries и types (надеюсь, все-таки, что отношение 1:N)
SELECT treasuries.rvdk_name, types.name, cnt
FROM
(
SELECT treasury, type, COUNT(id) cnt
FROM osnovni
GROUP BY treasury, type
) Gr
LEFT JOIN treasuries ON Gr.treasury = treasuries.ID
LEFT JOIN types ON Gr.type = types.ID
И вообще, если "дублирует записи из таблицы 2" значит из таблицы 3 присоединяется 2 записи, а не 1. Убери из запроса group by и поставь select * и убери Count, убедись в правильности полученных записей, а лишь затем включай группировку
← →
Karlson (2004-01-27 09:48) [2]Пасиба!
Отношение действительно 1:N и том и другом случае.
Все класнно работает, но! В первом столбце выдает инфу из таблицы treasuries, во втором из types, в третьем количество. Второй и третий столбцы - все как нужно, а вот первый - там записи повторяются при разных данных второго столбца, как решить эту проблему?
← →
Karlson (2004-01-27 16:24) [3]Народ, хелпаните! плиз
← →
HSolo (2004-01-27 17:09) [4]Структура таблиц? Как должен выглядеть желаемый результат?
← →
Karlson (2004-01-27 17:56) [5]Выше же все описано...
← →
HSolo (2004-01-27 18:13) [6]Ну если действительно все, то Вам ответили правильно
← →
ЮЮ (2004-01-28 03:22) [7]Ну а разложить в шахматку - это уже или на клиенте, или в XП, т.к. просто запросом "прямоугольник" не получишь
Или динамически формировать запрос, т.к. количество столбцов непостоянно и заранее не известго. Вот примеры из BOL:
SELECT Year,
SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1,
SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2,
SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3,
SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4
FROM Northwind.dbo.Pivot
GROUP BY Year
Или
SELECT P1.*, (P1.Q1 + P1.Q2 + P1.Q3 + P1.Q4) AS YearTotal
FROM (SELECT Year,
SUM(CASE P.Quarter WHEN 1 THEN P.Amount ELSE 0 END) AS Q1,
SUM(CASE P.Quarter WHEN 2 THEN P.Amount ELSE 0 END) AS Q2,
SUM(CASE P.Quarter WHEN 3 THEN P.Amount ELSE 0 END) AS Q3,
SUM(CASE P.Quarter WHEN 4 THEN P.Amount ELSE 0 END) AS Q4
FROM Pivot AS P
GROUP BY P.Year) AS P1
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.015 c