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

Откуда:
Сообщений: 36
Добрый день!

Есть следующая задача.

Есть таблица А в которой хранится информация о подписках клиента. У клиента может быть неограниченное число подписок разного типа.
Таблица А имеет вид

id Уникальный идентификатор подписки
email Емейл
Type Тип подписки, представляет собой целое число
State Состояние подписки (имеет три возможных значения 1 – не подтверждено, 2 –подтверждено, 3 – подписка удалена)

Также имеется таблица В, в которой содержится информация о заказах клиентов и имеет вид:
id Уникальный идентификатор заказа
email Емейл
Create_date Дата оформления заказа
Category Категория, из которой был куплен товар
Is_finished Флаг, определяющий, получен ли клиентом заказ (1 –да, 0 –нет)

Необходимо выгрузить следующую информацию: емейл клиента, тип его подписки, общее количество заказов клиента за последний год.
Условия, которым должны удовлетворять результаты выгрузки:
- клиент имеет тип подписки равный 5 или 11,
- если подписка типа 11, то она должна находиться в состоянии = 2,
- если –типа 5, то подписка не должна быть в состоянии = 3
- у клиента нет ни одной подписки в состоянии = 3
- у клиента нет подписки, имеющей тип 2
- клиент получил хотя б один заказ за последние 2 года
- у клиента был хотя б один заказ в категории 60, и нет ни одного не полученного заказа из этой категории
- клиент может иметь не полученные заказы в категориях (1,3,5,7,9)
- самый поздний по дате заказ клиента сделан в категориях (2,4,8)


Мой вариант запроса:

Select A.Email, A.Type, count (B.ID)

From Table A A

Join Table B B on A.Email=B.Email

Where B.Create_date>DateAdd (month, (-12), GetDate()) and

((A.Type=11 and A.State=2 and A.State<>3) or (A.Type=5 and A.State<>3)) and

(B.Category in (1,3,5,7,9) and B.IsFinished>0)

Group by A.Email, A.Type,B.Is_finished, B.Create_date, B.Category

Having 

(count (B.ID)>=1 and B.Is_finished=1  and B.Create_Date>DateAdd(month,(-24),GetDate())) and 

(count (B.ID)>=1 and B.Category=60 and B.Is_finished=1) and 

(B.Create_date=Max(B.Create_date) and (B.Category=2 or B.Category=4 or B.Category=8))


Подскажите верен ли мой вариант и если нет, где есть ошибки

Заранее спасибо!

Сообщение было отредактировано: 22 июн 14, 13:08
22 июн 14, 03:41    [16202128]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8826
Кто захочет разбираться? Корректность выполнения запроса производится тестированием. Тестирование это сверка ожидаемого результата с фактическим.
22 июн 14, 14:02    [16202529]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Как же может быть одновременно и
B.Category=60
и
B.Category=2 or B.Category=4 or B.Category=8
???
Оттого, что Вы написали
count (B.ID)>=1 and B.Is_finished=1
два раза, а не один, что-то изменилось?
22 июн 14, 14:36    [16202591]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
halfpintboy
Подскажите верен ли мой вариант и если нет, где есть ошибки

Заранее спасибо!


а где ваша условия в запросе,?

если подписка типа 11, то она должна находиться в состоянии = 2,
- если –типа 5, то подписка не должна быть в состоянии = 3
- у клиента нет ни одной подписки в состоянии = 3
- у клиента нет подписки, имеющей тип 2
[/color]

не придумали использоват

case when

CASE  when <если подписка типа 11>     then  <то она должна находиться в состоянии = 2>
         when  <...............................>     then <............................................................>
else <приветик>
end

и  +  ++ +   изменит   join на   left join
23 июн 14, 00:06    [16204012]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
yaxta,

"Если, То" в постановке задачи, не значит что надо писать в CASE WHEN THEN
Что за прямолинейное мышление?!
Именно это и хотят протестировать такой постановкой. Заметят CASE - сразу же неуд.
23 июн 14, 09:48    [16204797]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
Mnior
yaxta,

"Если, То" в постановке задачи, не значит что надо писать в CASE WHEN THEN
Заметят CASE - сразу же неуд.


а я не согласен
23 июн 14, 09:52    [16204822]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
yaxta,

если можно попросим

создател тему :


Покажите пожалуйста

пример структура таблицы

и какой резултат вы хотите получит резултат запроса
23 июн 14, 10:09    [16204905]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
halfpintboy
Member

Откуда:
Сообщений: 36
Про подписки:
Если я правильно понимаю, то тут явно не case (хотя первая мысль у меня такая же была)

Тут скорее сложное условие, как я и написал

((A.Type=11 and A.State=2 and A.State<>3) or (A.Type=5 and A.State<>3))
23 июн 14, 12:49    [16205867]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
halfpintboy
Про подписки:
Если я правильно понимаю, то тут явно не case (хотя первая мысль у меня такая же была)

Тут скорее сложное условие, как я и написал

((A.Type=11 and A.State=2 and A.State<>3) or (A.Type=5 and A.State<>3))



тогда что останавливает вас?
23 июн 14, 12:54    [16205889]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
halfpintboy
Member

Откуда:
Сообщений: 36
iap
Как же может быть одновременно и
B.Category=60
и
B.Category=2 or B.Category=4 or B.Category=8
???
Оттого, что Вы написали
count (B.ID)>=1 and B.Is_finished=1
два раза, а не один, что-то изменилось?


Вот в этом и была неуверенность. Насчет того, как реализовать возможность чтобы у клиента был хоть бы один заказ из категории 60, но ни одного полученного заказа из данной категории и одновременно могли быть неполученные заказы из категорий (1,3,5,7,9)
Главный затык в этом был
23 июн 14, 12:57    [16205900]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
halfpintboy
iap
Как же может быть одновременно и
B.Category=60
и
B.Category=2 or B.Category=4 or B.Category=8
???
Оттого, что Вы написали
count (B.ID)>=1 and B.Is_finished=1
два раза, а не один, что-то изменилось?


Вот в этом и была неуверенность. Насчет того, как реализовать возможность чтобы у клиента был хоть бы один заказ из категории 60, но ни одного полученного заказа из данной категории и одновременно могли быть неполученные заказы из категорий (1,3,5,7,9)
Главный затык в этом был


вы точно знаете что хотите?
23 июн 14, 13:03    [16205948]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
yaxta
а я не согласен

A: 2+2=4
Б: а я не согласен!
От этого повысится аргументация?!
yaxta
Mnior
"Если, То" в постановке задачи, не значит что надо писать в CASE WHEN THEN
а я не согласен
Вы, yaxta, утверждаете что если в постановке задачи написано "Если, То", то это однозначно всегда означает что вынужденно надо писать CASE WHEN THEN.

Простите, но это полный бред.

halfpintboy, освойте Exists()
halfpintboy
Where B.Create_date>DateAdd (month, (-12), GetDate())
Уже не верно, нигде не сказано что надо выгружать только эти подписки. Перечитайте:
halfpintboy
- клиент получил хотя б один заказ за последние 2 года
23 июн 14, 13:53    [16206349]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
Mnior
вы, yaxta, утверждаете что если в постановке задачи написано "Если, То", то это однозначно всегда означает что вынужденно надо писать CASE WHEN THEN.)))
[/quot]


я настырно ничего не записал

читайте ето пожалуйста что я записал


если можно попросим

создател тему :


Покажите пожалуйста 

пример структура таблицы

и какой резултат вы хотите получит резултат запроса



мы просто пока чуствуем

если создател тему хочет окончателный скрипт надо видит табло и видит резултат запроса

а не думат ее
23 июн 14, 13:59    [16206415]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
yaxta
я настырно ничего не записал
Писал!
Цитирую 16204822:
yaxta
Mnior
yaxta,

"Если, То" в постановке задачи, не значит что надо писать в CASE WHEN THEN
Заметят CASE - сразу же неуд.
а я не согласен

yaxta
если создател тему хочет окончателный скрипт
Тогда посылают его далеко и на долго.
Тут можно только объяснить и посоветовать. Никаких "окончателный скрипт".

Стартового поста хватает сказать что подход корявый.
Не надо смешивать выходной поток с фильтрами допуска.
23 июн 14, 15:27    [16207146]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
[quot Mnior]
yaxta
я настырно ничего не записал
Писал!
Цитирую 16204822


тогда стреляй
23 июн 14, 16:12    [16207566]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
halfpintboy
Member

Откуда:
Сообщений: 36
Про exists я в курсе.
Но вы хотите сказать, что условия задачи
- у клиента был хотя б один заказ в категории 60, и нет ни одного не полученного заказа из этой категории
- клиент может иметь не полученные заказы в категориях (1,3,5,7,9)
- самый поздний по дате заказ клиента сделан в категориях (2,4,8)
Таже делаются отдельными экзистами, а не в хевинге?
Можно попросить вас набросать какой то более-менее финальный вариант запроса с получившимися изменениями?
23 июн 14, 20:48    [16208826]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
halfpintboy
Member

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

Так я же отписал в первом посте. Структуйра - две таблицы A и B с указанными колонками.

Как результат запроса-нужно вывести имейлы клиентов, типы подписок и количество заказов за последний год
23 июн 14, 20:53    [16208834]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
halfpintboy
Member

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

Ну вообще то сказано, поскольку в условии нужно получить кол-во заказов клиентов за последний год

Значит получается следующее:

Select A.Email, A.Type, count (B.ID)

From Table A A

Join Table B B on A.Email=B.Email

Where

((A.Type=11 and A.State=2 and A.State<>3) or (A.Type=5 and A.State<>3))

and exists (Select B.Email From Orders Where B.Create_date>DateAdd(month,(-24),GetDate()))

and exists (Select B.Email From Orders Where B.Category=60 and B.IsFinished<>0)

and exists (Select B.Email From Orders Where B.Category In (1,3,5,7,9) and B.IsFinished=0)

and exists (Select B.Email From Orders Where (B.Create_date=Max(B.Create_date) and (B.Category=2 or B.Category=4 or B.Category=8))

Group by A.Email, B.Create_date

Having B.Create_date>DateAdd (month, (-12), GetDate())

Ну или либа два запроса, в первом из них выводим имейлы и тайпы, во втором количество.

Подскажите плз так или нет
23 июн 14, 21:33    [16208955]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
halfpintboy
Mnior,

Подскажите плз так или нет



Mnior Подскажите плз так или нет
24 июн 14, 08:49    [16209878]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
halfpintboy
Ну или либа два запроса, в первом из них выводим имейлы и тайпы, во втором количество.

Подскажите плз так или нет

а у кого кроме вас есть БД с данными чтоб смотреть так ето или нет ? Или вы считаете что Mnior = Ванга ?
24 июн 14, 10:36    [16210344]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
[quot Maxx]
halfpintboy
Или вы считаете что Mnior = Ванга ?


ха ха ха

новерно NOSTRADAMUS
24 июн 14, 10:49    [16210450]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
halfpintboy
Member

Откуда:
Сообщений: 36
При чем здесь Ванга?
Требуется БД чтобы сказать правильно ли логически написан запрос или нет?
24 июн 14, 18:11    [16213380]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
halfpintboy
При чем здесь Ванга?


а причем Mnior ???
скопируйте ваш скрипт вставите на MSSQL и нажмите F5 все будет ясно


Требуется БД чтобы сказать правильно ли логически написан запрос или нет?


новерно да
исползоват етот скрипт надо MSSQL server
24 июн 14, 23:39    [16214326]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить