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

Таблица абонементы Abonements
ID, ClientID, CourseID, CreateDateTime
Нужно подсчитать кол-во клиентов, у которых в заданном периоде приобретены
абонементы по двум и более курсам.

Сгруппировать сгруппировал, а как посчитать не могу вкурить.
Может через join надо делать?

select COUNT(*), ClientID, CourseID from Abonements t1
where CreateDateTime between '20171201' and '20180101'
Group by ClientID, CourseID
29 дек 17, 10:14    [21071842]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет кол-ва абонементов с разными курсами  [new]
Goga-Gola
Guest
guest_1234567,

HAVING COUNT(*) > 1
?
29 дек 17, 10:18    [21071853]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет кол-ва абонементов с разными курсами  [new]
xenix
Guest
guest_1234567,

select COUNT(*), ClientID, CourseID from Abonements t1
where CreateDateTime between '20171201' and '20180101'
Group by ClientID, CourseID
HAVING COUNT(*)>=2
29 дек 17, 10:20    [21071862]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет кол-ва абонементов с разными курсами  [new]
Goga-Gola
Guest
guest_1234567,

SELECT COUNT(*)
FROM
(
SELECT COUNT(*), ClientID, CourseID
FROM Abonements t1
WHERE CreateDateTime between '20171201' and '20180101'
GROUP BY ClientID, CourseID
HAVING COUNT(*) > 1
)
29 дек 17, 10:21    [21071865]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет кол-ва абонементов с разными курсами  [new]
Goga-Gola
Guest
guest_1234567,

Новый год с утра :)

SELECT COUNT(*)
FROM
(
SELECT ClientID
FROM Abonements t1
WHERE CreateDateTime between '20171201' and '20180101'
GROUP BY ClientID, CourseID
HAVING COUNT(*) > 1
)
GROUP BY ClientID
 
29 дек 17, 10:29    [21071894]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет кол-ва абонементов с разными курсами  [new]
Goga-Gola
Guest
guest_1234567,


Хотя, если у Вас возможно 2 клиента в 1 период с одним курсом в таблице (мало ли), то лучше так:

DECLARE @T TABLE (ID INT IDENTITY(1,1), ClientID INT, CourseID INT, CreateDateTime DATE)

INSERT @T
VALUES (1,1,'11.12.2017'),
       (2,1,'11.12.2017'),
       (1,3,'11.12.2017'),
       (3,1,'11.12.2017'),
       (1,4,'11.12.2017'),
       (2,3,'11.12.2017')
       

; WITH CTE AS
(
SELECT ClientID, CourseID
FROM @T
WHERE CreateDateTime BETWEEN '11.11.2017' AND '31.12.2017'
GROUP BY ClientID, CourseID
)

SELECT COUNT(*)
FROM 
(
SELECT ClientID 
FROM CTE
GROUP BY ClientID
HAVING COUNT(*) > 1
) Z
29 дек 17, 10:45    [21071945]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет кол-ва абонементов с разными курсами  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
Логичнее считать COUNT(DISTINCT CourseID)
29 дек 17, 10:57    [21071977]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет кол-ва абонементов с разными курсами  [new]
Goga-Gola
Guest
iap
Логичнее считать COUNT(DISTINCT CourseID)


в каком месте?

Скрипт есть выше на создание и заполнение...
29 дек 17, 11:02    [21071991]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет кол-ва абонементов с разными курсами  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
Goga-Gola
iap
Логичнее считать COUNT(DISTINCT CourseID)


в каком месте?

Скрипт есть выше на создание и заполнение...
Вместо COUNT(*)
29 дек 17, 11:03    [21071999]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет кол-ва абонементов с разными курсами  [new]
Goga-Gola
Guest
iap,

В моем примере ClientID...
В примере ТС - это не поможет...
Мы же не курсы считаем
29 дек 17, 11:07    [21072008]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет кол-ва абонементов с разными курсами  [new]
guest_1234567
Guest
Goga-Gola,

автор
Хотя, если у Вас возможно 2 клиента в 1 период с одним курсом в таблице (мало ли), то лучше так:

Может.
Спасибо! Попробую.
29 дек 17, 11:33    [21072155]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет кол-ва абонементов с разными курсами  [new]
Goga-Gola
Guest
[quot guest_1234567]Goga-Gola,

автор
Спасибо! Попробую.


чуть меньше текста с тем же планом выполнения :)


; WITH CTE AS
(
SELECT ClientID, CourseID, COUNT(*) OVER (PARTITION BY ClientID) ANumber
FROM @T
WHERE CreateDateTime BETWEEN '01.11.2017' AND '31.12.2017'
GROUP BY ClientID, CourseID
)
SELECT COUNT(DISTINCT ClientID) 
FROM CTE
WHERE ANumber > 1
29 дек 17, 12:38    [21072424]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет кол-ва абонементов с разными курсами  [new]
Goga-Gola
Guest
Goga-Gola,

и даже группировка тут лишняя


; WITH CTE AS
(
SELECT ClientID, COUNT(*) OVER (PARTITION BY ClientID) ANumber
FROM @T
WHERE CreateDateTime BETWEEN '11.11.2017' AND '31.12.2017'
)
SELECT COUNT(DISTINCT ClientID) 
FROM CTE
WHERE ANumber > 1



ну, вроде уже все что можно урезал :)
29 дек 17, 12:42    [21072444]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить