Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите, пожалуйста, запрос написать 
V
    Опции темы
mal
Дата 12.7.2007, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



Имеются 3 таблицы:abons,devices,trans. У таблицы abons есть первичный ключ abons_id. У таблиц devices и trans есть реквизит abons_id. Таблица abons связана с таблицами devices  и trans отношением один ко многим.
Необходимо сформировать запрос с колонками:
abons_id,
(количество строк в таблице devices у которых devices.abons_id = abons.abons_id),
(количество строк в таблице trans у которых trans.abons_id = abons.abons_id)
PM   Вверх
Akina
Дата 12.7.2007, 11:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Код

select abons.abons_id, count(devices.abons_id) as count_devices, count(trans.abons_id) as count_trans
from abons
  join devices
    on devices.abons_id = abons.abons_id
  join trans 
    on trans.abons_id = abons.abons_id
group by abons.abons_id
?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
mal
Дата 12.7.2007, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



Заполним таблицы:
abons (колонка abons_id) 
1 строка                  1
2 строка                  2
devices (колонки devices_id, abons__id)
1 строка                     1                  1
2 строка                     2                  1
3 строка                     3                  1
4 строка                     4                  2
5 строка                     5                  2
trans (колонки trans_id, abons__id)
1 строка                     1                  2


Ваш запрос выдаёт:
abons_id, count_devices, count_trans
2                          2                  2

Это сообщение отредактировал(а) mal - 12.7.2007, 13:01
PM   Вверх
ТоляМБА
Дата 17.7.2007, 04:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: нет
Всего: 252



Код
SELECT COUNT(devices.Abons_id) AS CountDevices,
(SELECT COUNT(Trans.Abons_id)
FROM Trans
INNER JOIN Abons
ON Trans.Abons_id = Abons.Abons_id) AS CountTrans
FROM  devices
INNER JOIN Abons
ON devices.Abons_id = Abons.Abons_id


Оно?
Если надо кол-во уникальных строк, то после COUNT( ставь DISTINCT
PM   Вверх
mal
Дата 17.7.2007, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



Вы наверно не правильно поняли задачу.
Имеются 3 таблицы abons(Абоненты), devices(приборы) и trans(трансформаторы). Необходимо вывести таблицы с колонками:
abons_id
Кол. приборов
Кол. трансформаторов.

Из приведенных таблиц в сообщении от 12.7.2007, 12:57 запрос должен выдать
2 строчки:
1                 3                 0
2                 2                 1


P.S. Спасибо за помощь!
PM   Вверх
ТоляМБА
Дата 17.7.2007, 09:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: нет
Всего: 252



Цитата(mal @  17.7.2007,  08:35 Найти цитируемый пост)
Из приведенных таблиц в сообщении от 12.7.2007, 12:57 запрос должен выдать
2 строчки:
1                 3                 0
2                 2                 1


Лови код:
Код
Select d.abons_id, IsNull(d.DevicesCount,0) as DevicesCount, IsNull(t.TransCount,0) as TransCount
from 
(SELECT Abons.abons_id, COUNT(Devices.abons_id) AS DevicesCount
FROM  Abons LEFT OUTER JOIN
               Devices ON Abons.abons_id = Devices.abons_id
GROUP BY Abons.abons_id) as d
left outer join
(SELECT Abons.abons_id, COUNT(Trans.abount_id) AS TransCount
FROM  Abons INNER JOIN
               Trans ON Abons.abons_id = Trans.abount_id
GROUP BY Abons.abons_id) as t
on d.abons_id=t.abons_id


Если кто-нибудь найдёт вариант решения покороче, будет интересно посмотреть, а то может я лишнего чего наворопятил.  smile 
PM   Вверх
Akina
Дата 17.7.2007, 09:44 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



У меня Аксесс сотворил вот что:

Код

SELECT abons.abons_id, Q1.[Count-devices_id], Q2.[Count-trans_id]
FROM 
(
  (
    SELECT abons.abons_id, Count(devices.devices_id) AS [Count-devices_id]
    FROM abons 
      INNER JOIN devices 
        ON abons.abons_id = devices.abons_id
    GROUP BY abons.abons_id
  ) as Q1 
  RIGHT JOIN abons 
  ON Q1.abons_id = abons.abons_id
) 
LEFT JOIN 
(
  SELECT abons.abons_id, Count(trans.trans_id) AS [Count-trans_id]
  FROM abons 
    INNER JOIN trans 
      ON abons.abons_id = trans.abons_id
  GROUP BY abons.abons_id
) as Q2 
ON abons.abons_id = Q2.abons_id;



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SergKO
Дата 17.7.2007, 10:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 14.3.2005

Репутация: 17
Всего: 20



По-моему так короче
Код

declare @abons table (abons_id int identity(1, 1), abons varchar(50));
declare @devices table (device_id int identity(1, 1), abons_id int);
declare @trans table (trans_id int identity(1, 1),  abons_id int);

    insert into @abons (abons)
        select '1111111111'
        union all
        select '2222222222';

    insert into @devices (abons_id)
        select 1
        union all
        select 1
        union all
        select 1
        union all
        select 2
        union all
        select 2;

    insert into @trans (abons_id)
        select 2;

    select a.abons_id, IsNull(d.cnt_dev, 0) as cnt_dev, IsNull(t.cnt_tran, 0) as cnt_tran
    from @abons a
        left outer join (select abons_id, count(*) as cnt_dev from @devices group by abons_id) d on d.abons_id = a.abons_id
        left outer join (select abons_id, count(*) as cnt_tran from @trans group by abons_id) t on t.abons_id = a.abons_id


PM MAIL   Вверх
mal
Дата 18.7.2007, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



Всем огромное СПАСИБО за помощь!!! smile 

Это сообщение отредактировал(а) mal - 18.7.2007, 10:16
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.