Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.17;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
1-53526
denis24
2004-02-04 20:39
2004.02.17
цвет курсора в listbox


1-53578
Norfolk
2004-02-07 12:19
2004.02.17
Генератор случайных чисел


6-53686
webpauk
2003-12-15 13:30
2004.02.17
определение OS на компах в сети


7-53778
Ил_204
2003-12-02 13:08
2004.02.17
Com-порт, модем


1-53525
rel_
2004-02-05 15:48
2004.02.17
Переадресация сообщения