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

Откуда:
Сообщений: 42
Уважаемые форумчане помогите составить не сложній запрос, в силу маленького опыта работы он вызвал у меня трудности.
Заранее спасибо!

Табл. клииенты:
ID, Дата приобритения товара, Товар.
В таблице, соответственно, периодически повторяются клиенты по мере приобритения имти какой либо техники.

Необходимо :
Вывести клиентов купивших, к примеру; стиральную машину, пылесос и микроволновку.
8 окт 08, 14:55    [6279761]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
select * 
from table
where TOVAR = 'стиралка'

а ваще BOL-> SELECT
-------------------------------------
Jedem Das Seine
8 окт 08, 15:01    [6279795]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Zegmund
Member

Откуда:
Сообщений: 42
Нет, если бы так просто... ((
Я, наверное, не очень правильно объяснил что необходимо, попробую так:
Вывести клиентов, которые купили И микроволновку И стиралку И пылесос.
8 окт 08, 15:06    [6279834]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Zegmund
Нет, если бы так просто... ((
Я, наверное, не очень правильно объяснил что необходимо, попробую так:
Вывести клиентов, которые купили И микроволновку И стиралку И пылесос.


Рекомендации по оформлению сообщений в форуме особенно п.6.
8 окт 08, 15:09    [6279862]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
и в чем проблема?
select * 
from table
where TOVAR IN('стиральная машина','пылесос','микроволновка')
8 окт 08, 15:09    [6279864]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
select [клиентов] 
from table
where TOVAR in ( 'стиралка', 'пылесос', 'и микроволновку')
group by [клиентов], TOVAR  having count(*)=3
8 окт 08, 15:10    [6279869]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
IT-Shaman
Member

Откуда: Москва
Сообщений: 263
Knyazev Alexey
select [клиентов] 
from table
where TOVAR in ( 'стиралка', 'пылесос', 'и микроволновку')
group by [клиентов], TOVAR  having count(*)=3


это не совсем корректно. если клиент купил 2 раза пылесос и 1 раз микроволновку - ваш запрос покажет такого клиента, хотя это противоречит условию
я предлагаю сделать union

select [клиентов] 
from table
where TOVAR = 'стиралка'
group by [клиентов]
union
select [клиентов] 
from table
where TOVAR = 'пылесос'
group by [клиентов]
select [клиентов] 
from table
where TOVAR = 'и микроволновку'
group by [клиентов]


это не совсем гибко, в плане того, что работает только для трех товаров. однако программно можно сформировать sql запрос с нужным количеством unoin
8 окт 08, 15:22    [6279987]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Knyazev Alexey
select [клиентов] 
from table
where TOVAR in ( 'стиралка', 'пылесос', 'и микроволновку')
group by [клиентов], TOVAR  having count(DISTINCT TOVAR)=3
?
8 окт 08, 15:23    [6279997]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Zegmund
Member

Откуда:
Сообщений: 42
Knyazev Alexey
select [клиентов] 
from table
where TOVAR in ( 'стиралка', 'пылесос', 'и микроволновку')
group by [клиентов], TOVAR  having count(*)=3


Для чего
 having count(*)=3 
, ведь клиент может купить, например, пылесос несколько раз, т.е. будут существовать такие клиенты, у которых куплен пылесос, микроволновка,...,и опять пылесос... - такие клиенты должны попасть в результирующую выборку, но, если
 having count(*)=3 
- они туда, как я понимаю, не попадут.
8 окт 08, 15:23    [6280003]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
iap
Knyazev Alexey
select [клиентов] 
from table
where TOVAR in ( 'стиралка', 'пылесос', 'и микроволновку')
group by [клиентов], TOVAR  having count(DISTINCT TOVAR)=3
?


да...так правильнее
8 окт 08, 15:24    [6280009]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Zegmund
Knyazev Alexey
select [клиентов] 
from table
where TOVAR in ( 'стиралка', 'пылесос', 'и микроволновку')
group by [клиентов], TOVAR  having count(*)=3


Для чего
 having count(*)=3 
, ведь клиент может купить, например, пылесос несколько раз, т.е. будут существовать такие клиенты, у которых куплен пылесос, микроволновка,...,и опять пылесос... - такие клиенты должны попасть в результирующую выборку, но, если
 having count(*)=3 
- они туда, как я понимаю, не попадут.


тогда я вообще не понимаю смысла вашего запроса...
можно подробнее, что нужно, лучше на примере данных
8 окт 08, 15:25    [6280021]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Zegmund
Member

Откуда:
Сообщений: 42
Ок, постараюсь.

Есть таблица с клиентскими покупками, в которой каждая строчка соответствует одной покупке. Т.е.

Id Дата Покупка
------------------------
1 01,01,08 пылесос
1 01,01,08 пылесос
1 01,01,08 микроволновка
1 01,01,08 стиралка

2 01,01,08 микроволновка
2 01,01,08 стиралка

3 01,01,08 микроволновка
3 01,01,08 стиралка
3 01,01,08 пылесос
3 01,01,08 ХОЛОДИЛЬНИК


Необходимо Вывести клиентов купивших И стиральную машину И пылесос И микроволновку.
Т.е. ОТВЕТ в этой таб ---> 1 (т.к. купил все эти товары, не смотря на то, что какой то из них приобрел более одного раза)

2 - не подходит, .т.к. не купил пылесос
3 - не подходит, .т.к. купил ко всему ещё и ХОЛОДИЛЬНИК

Еще раз ВСЕМ заранее СПАСИБО!!!!
8 окт 08, 15:38    [6280146]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Zegmund
Member

Откуда:
Сообщений: 42
Сорри, таблица не наглядна, лучше так:

Id |Дата| Покупка
------------------------
1 | 01,01,08| пылесос
1 | 01,01,08 | пылесос
1 | 01,01,08 | микроволновка
1 | 01,01,08 | стиралка

2 | 01,01,08 | микроволновка
2 | 01,01,08 | стиралка

3 |01,01,08 |микроволновка
3 |01,01,08 | стиралка
3 |01,01,08 | пылесос
3 |01,01,08 | ХОЛОДИЛЬНИК
8 окт 08, 15:40    [6280167]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
тогда всё-таки вариант iap`а должен вас устроить
8 окт 08, 15:47    [6280238]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Glory
Member

Откуда:
Сообщений: 104760
select [клиентов] 
from table
group by [клиентов], TOVAR  having count(*)=sum(case when TOVAR in ( 'стиралка', 'пылесос', 'и микроволновку') then 1 else 0 end)
8 окт 08, 15:51    [6280278]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Zegmund
Member

Откуда:
Сообщений: 42
Knyazev Alexey
тогда всё-таки вариант iap`а должен вас устроить


Вариант
select [клиентов] 
from table
where TOVAR in ( 'стиралка', 'пылесос', 'и микроволновку')
возвращает клиентов, приобретавших хотя бы один из перечисленных товаров (т.е. в версии приведенной мной сверху таблицы, клиент id=2), а необходимо ВСЕ 3 товара!
8 окт 08, 16:31    [6280644]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Glory
Member

Откуда:
Сообщений: 104760
select [клиентов] 
from table
group by [клиентов] having count(*)=sum(case when TOVAR in ( 'стиралка', 'пылесос', 'и микроволновку') then 1 else 0 end)
8 окт 08, 16:34    [6280670]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
SELECT T.[ID],
SUM(
CASE 
WHEN T.TOVAR ='стиральная машина' THEN 1
WHEN T.TOVAR ='пылесос' THEN 1
WHEN T.TOVAR ='микроволновка' THEN 1
ELSE 0 END) as [Все]
FROM (SELECT DISTINCT * FROM [Table]) T
GROUP BY [ID]
HAVING SUM(
CASE 
WHEN T.TOVAR ='стиральная машина' THEN 1
WHEN T.TOVAR ='пылесос' THEN 1
WHEN T.TOVAR ='микроволновка' THEN 1
ELSE 0 END)=3 
8 окт 08, 16:39    [6280738]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Zegmund
Member

Откуда:
Сообщений: 42
Всем огромное спасибо, но необходим вариант без CASE, запрос пишется на ACCESS SQL.
8 окт 08, 17:36    [6281223]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Glory
Member

Откуда:
Сообщений: 104760
Zegmund
Всем огромное спасибо, но необходим вариант без CASE, запрос пишется на ACCESS SQL.

Ну так там же есть аналог CASE
8 окт 08, 17:37    [6281229]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
IIF() тогда сложный
8 окт 08, 17:37    [6281230]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Zegmund
Member

Откуда:
Сообщений: 42
Konst_One
SELECT T.[ID],
SUM(
CASE 
WHEN T.TOVAR ='стиральная машина' THEN 1
WHEN T.TOVAR ='пылесос' THEN 1
WHEN T.TOVAR ='микроволновка' THEN 1
ELSE 0 END) as [Все]
FROM (SELECT DISTINCT * FROM [Table]) T
GROUP BY [ID]
HAVING SUM(
CASE 
WHEN T.TOVAR ='стиральная машина' THEN 1
WHEN T.TOVAR ='пылесос' THEN 1
WHEN T.TOVAR ='микроволновка' THEN 1
ELSE 0 END)=3 



А будет ли оно работать если ?

Id |Дата| Покупка
------------------------
1 | 01,01,08| пылесос
1 | 02,02,08 | пылесос
1 | 01,01,08 | микроволновка
1 | 01,01,08 | стиралка

?

Т.е
 (SELECT DISTINCT * FROM [Table]) 

не исключит

1 | 02,02,08 | пылесос
8 окт 08, 17:51    [6281340]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
...(SELECT DISTINCT [ID],[TOVAR] FROM [Table]) T...
8 окт 08, 17:53    [6281357]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Zegmund
Member

Откуда:
Сообщений: 42
Все получилось, спасибо всем за помощь!!!
8 окт 08, 19:30    [6281730]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз!  [new]
Glory
Member

Откуда:
Сообщений: 104760
Zegmund
Все получилось, спасибо всем за помощь!!!

Убедительная просьба в следующий раз вопросы по Access задавать в соответствующем форуме
8 окт 08, 21:22    [6281929]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить