Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запросы с агрегированными функциями  [new]
NektoN
Member

Откуда:
Сообщений: 44
Привет всем!
У меня есть таблицы:
МодельУстройства(id_модели, наименование, фирма)
Устройства(СерийныйНомер,id_модели,...)
РемонтУстройств(id_ремонта,id_причины,СерийныйНомер,...)
ПричиныРемонта(id_причины,наименование)

нужно написать запрос, который возвращает фирму, устройства которой чаще попадают в ремонт.

и запрос, возвращающий причину, по которой чаще всего устройства попадают в ремонт.

как это осуществить? совсем запуталась.помогите,пожалуйста.
заранее спасибо.
30 ноя 09, 19:25    [7998729]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с агрегированными функциями  [new]
NektoN
Member

Откуда:
Сообщений: 44
Вот до чего я сама дошла, а что делать дальше?

К сообщению приложен файл. Размер - 0Kb
30 ноя 09, 19:41    [7998757]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с агрегированными функциями  [new]
iljy
Member

Откуда:
Сообщений: 8711
NektoN
Привет всем!
У меня есть таблицы:
МодельУстройства(id_модели, наименование, фирма)
Устройства(СерийныйНомер,id_модели,...)
РемонтУстройств(id_ремонта,id_причины,СерийныйНомер,...)
ПричиныРемонта(id_причины,наименование)

нужно написать запрос, который возвращает фирму, устройства которой чаще попадают в ремонт.

и запрос, возвращающий причину, по которой чаще всего устройства попадают в ремонт.

Вам одновременно надо это получить? или можно разными запросами? Разными - так:
select top 1 with ties IDФирмы, Count(*)
from ....
group by IDФирмы
order by 2 desc
select top 1 with ties наименование, Count(*)
from РемонтУстройства r join Причины ремонта p on r.id_причины = p.id_причины
group by id_причины, наименование
order by 2 desc
30 ноя 09, 20:57    [7998903]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с агрегированными функциями  [new]
NektoN
Member

Откуда:
Сообщений: 44
iljy,
спасибо большое! Я вчера справилась сама, но более сложным путём - создала представление и в нем искала максимум.

а как лучше, на Ваш взгляд, сделать запрос, который выводил бы список устройств, купленных за последние 5 лет?

SELECT инвентарныйНомер
FROM Устройства
WHERE (DATEDIFF(y,ДатаПокупки, GETDATE()))<=5

если ДатаПокупки тоже содержиться в таблице Устройства
1 дек 09, 16:55    [8003970]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с агрегированными функциями  [new]
лет, говорите?...
Guest
select DATEDIFF(y, '2009-11-25', GETDATE())

----------- 
6
1 дек 09, 17:32    [8004305]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с агрегированными функциями  [new]
NektoN
Member

Откуда:
Сообщений: 44
лет, говорите?...,

6????????
а как тогда?
1 дек 09, 18:04    [8004571]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с агрегированными функциями  [new]
~
Guest
NektoN
лет, говорите?...,

6????????
а как тогда?


ну если такие ньюансы - несмущают
select DATEDIFF(yy, '2004-01-01', GETDATE())
----------- 
5
то можно просто добавить y
1 дек 09, 18:23    [8004647]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с агрегированными функциями  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
SELECT инвентарныйНомер
FROM Устройства
WHERE ДатаПокупки>=dateadd(yyyy, getdate(), -5)

для спящего время бодрствования равносильно сну
1 дек 09, 18:24    [8004654]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с агрегированными функциями  [new]
iljy
Member

Откуда:
Сообщений: 8711
NektoN
iljy,
спасибо большое! Я вчера справилась сама, но более сложным путём - создала представление и в нем искала максимум.

а как лучше, на Ваш взгляд, сделать запрос, который выводил бы список устройств, купленных за последние 5 лет?

SELECT инвентарныйНомер
FROM Устройства
WHERE (DATEDIFF(y,ДатаПокупки, GETDATE()))<=5

если ДатаПокупки тоже содержиться в таблице Устройства

Такой вариант напрочь лишает оптимизатор возможности применить индекс. Делайте так:
SELECT инвентарныйНомер
FROM Устройства
WHERE ДатаПокупки >= DATEADD(y,-5, GETDATE()))
Или если надо округлить до года - так
WHERE ДатаПокупки >= DATEADD(y,DATEDIFF(y,0, GETDATE()) -4, 0)
1 дек 09, 18:29    [8004672]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с агрегированными функциями  [new]
iljy
Member

Откуда:
Сообщений: 8711
iljy,

не Y, а year конечно. Или YY. Или YYYY.
1 дек 09, 18:31    [8004681]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с агрегированными функциями  [new]
NektoN
Member

Откуда:
Сообщений: 44
как всё оказывается просто)))
спасибо всем огромное!
1 дек 09, 18:34    [8004700]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с агрегированными функциями  [new]
NektoN
Member

Откуда:
Сообщений: 44
iljy,

а как тогда реализовать усложненный вариант запроса:
сколько устройств куплено за какой-либо последний год данной фирмой?
я так понимаю, что через процедуру с входным параметром?
Вот что я сделала:

но как сделать так, чтоб больше информации вывести об устройстве можно было?
когда я хочу вывести НаименованиеФирмы и др, он ругается на саму процедуру

К сообщению приложен файл. Размер - 0Kb
1 дек 09, 21:48    [8005226]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с агрегированными функциями  [new]
iljy
Member

Откуда:
Сообщений: 8711
NektoN
iljy,

а как тогда реализовать усложненный вариант запроса:
сколько устройств куплено за какой-либо последний год данной фирмой?
я так понимаю, что через процедуру с входным параметром?
Вот что я сделала:

но как сделать так, чтоб больше информации вывести об устройстве можно было?
когда я хочу вывести НаименованиеФирмы и др, он ругается на саму процедуру

Вставляйте запросы текстом, не надо картинкой! Мне его как проверить если что? набивать?
А как вы пытаетесь и как ругается? Если просто вставляете НазваниеФирмы в список SELECT - понятное дело ругнется. И потом - вам общую сумму за 5 лет надо или покупки по дням? Ну и главное - условие из HAVING перенесите во WHERE, ему там самое место.
1 дек 09, 23:09    [8005372]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с агрегированными функциями  [new]
NektoN
Member

Откуда:
Сообщений: 44
iljy, с дополнительной информацией по устройствам я разобралась, а вот с датами...

iljy

если ДатаПокупки тоже содержиться в таблице Устройства

Такой вариант напрочь лишает оптимизатор возможности применить индекс. Делайте так:
SELECT инвентарныйНомер
FROM Устройства
WHERE ДатаПокупки >= DATEADD(y,-5, GETDATE()))
Или если надо округлить до года - так
WHERE ДатаПокупки >= DATEADD(y,DATEDIFF(y,0, GETDATE()) -4, 0)
[/quot]

DATEDIFF(y,0, GETDATE()) -4, 0)
можешь объяснить почему GETDATE()) -4? и что значит последний ноль?
2 дек 09, 13:07    [8007824]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с агрегированными функциями  [new]
iljy
Member

Откуда:
Сообщений: 8711
NektoN

DATEDIFF(y,0, GETDATE()) -4, 0)
можешь объяснить почему GETDATE()) -4? и что значит последний ноль?


А посмотреть как скобки расставлены?
DATEADD(
   y,
   DATEDIFF(
               y,
               0,
               GETDATE()
               ) -4,
   0)
А потом зайти в БОЛ и почитать про функции, представления даты и т.п.? 0 - целое число ;) А при приведении к дате получается дата 1 января 1900, что тоже написано в БОЛ, и по сути не важно какая именно это дата, нас устроит любое 1 января, главное чтоб одинаковое было в DATEDIFF и DATEADD.
2 дек 09, 13:28    [8007967]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить