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

Откуда:
Сообщений: 2
суть вопроса:
нужно вывести текущих абонентов, являющихся абонентами данного оператора более 5 лет

написал скрипт, но логика там такая, что он выводит все смены тарифа, поэтому группирую по оператору, но COUNT после GROUP BY считает все строки, а не так, как сгруппированы

SELECT История_давних.номер, История_давних.ID_оператора--, COUNT(История_давних.ID_оператора)
FROM (
SELECT Давние_подключения.номер, Операторы.ID_оператора
FROM [История тарифов]
INNER JOIN (
SELECT [История тарифов].номер, MAX([История тарифов].дата_подключения) AS дата_подключения
FROM [История тарифов]
WHERE [История тарифов].дата_подключения < DATEADD(year,-5, GETDATE())
GROUP BY [История тарифов].номер
) AS Давние_подключения
ON [История тарифов].номер = Давние_подключения.номер
INNER JOIN Тарифы
ON Тарифы.ID_тарифа = [История тарифов].ID_тарифа
INNER JOIN Операторы
ON Операторы.ID_оператора = Тарифы.ID_оператора
WHERE [История тарифов].дата_подключения BETWEEN Давние_подключения.дата_подключения AND GETDATE()
) AS История_давних
INNER JOIN (
SELECT [Номера абонентов].номер, Операторы.ID_оператора, Операторы.название --
FROM [Номера абонентов]
INNER JOIN Тарифы
ON Тарифы.ID_тарифа = [Номера абонентов].ID_тарифа
INNER JOIN Операторы
ON Операторы.ID_оператора = Тарифы.ID_оператора
) AS Текущий_оператор
ON Текущий_оператор.номер = История_давних.номер

GROUP BY История_давних.номер, История_давних.ID_оператора

К сообщению приложен файл. Размер - 137Kb
1 ноя 19, 07:06    [22007661]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на T-SQL  [new]
court
Member

Откуда:
Сообщений: 1831
Fastredialer
суть вопроса:
нужно вывести текущих абонентов, являющихся абонентами данного оператора более 5 лет

написал скрипт, но логика там такая, что он выводит все смены тарифа, поэтому группирую по оператору, но COUNT после GROUP BY считает все строки, а не так, как сгруппированы

SELECT История_давних.номер, История_давних.ID_оператора[color=green]--, COUNT(История_давних.ID_оператора)[/color]
FROM (
    SELECT Давние_подключения.номер, Операторы.ID_оператора
    FROM [История тарифов]
    INNER JOIN (
        SELECT [История тарифов].номер, MAX([История тарифов].дата_подключения) AS дата_подключения
        FROM [История тарифов]
        WHERE [История тарифов].дата_подключения < DATEADD(year,-5, GETDATE())
        GROUP BY [История тарифов].номер
    ) AS Давние_подключения
    ON [История тарифов].номер = Давние_подключения.номер
    INNER JOIN Тарифы
    ON Тарифы.ID_тарифа = [История тарифов].ID_тарифа
    INNER JOIN Операторы
    ON Операторы.ID_оператора = Тарифы.ID_оператора
    WHERE [История тарифов].дата_подключения BETWEEN Давние_подключения.дата_подключения AND GETDATE()
) AS История_давних
INNER JOIN (
    SELECT [Номера абонентов].номер, Операторы.ID_оператора, Операторы.название -- 
    FROM [Номера абонентов]
    INNER JOIN Тарифы
    ON Тарифы.ID_тарифа = [Номера абонентов].ID_тарифа
    INNER JOIN Операторы
    ON Операторы.ID_оператора = Тарифы.ID_оператора
) AS Текущий_оператор
ON Текущий_оператор.номер = История_давних.номер

GROUP BY История_давних.номер, История_давних.ID_оператора


Картинка с другого сайта.

В табл.[История тарифов] с ПК какая-то лажа
Только один абонент в день может только подключиться чтоле ? Картинка с другого сайта.

Fastredialer
нужно вывести текущих абонентов, являющихся абонентами данного оператора более 5 лет
Суммарно, провели "на операторе" более 5-ти лет и сейчас являются его абонентами ?
Или первый раз подключались к этому оператору более 5 лет назад и сейчас являются его абонентами ?
1 ноя 19, 11:20    [22007883]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на T-SQL  [new]
court
Member

Откуда:
Сообщений: 1831
court
В табл.[История тарифов] с ПК какая-то лажа
Только один абонент в день может только подключиться чтоле ? Картинка с другого сайта.

... эээ, это все 3-и поля ПК, - тогда замечание снимается
1 ноя 19, 11:23    [22007893]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на T-SQL  [new]
court
Member

Откуда:
Сообщений: 1831
court
Суммарно, провели "на операторе" более 5-ти лет и сейчас являются его абонентами ?
Или первый раз подключались к этому оператору более 5 лет назад и сейчас являются его абонентами ?

вообщем, с этого можно начать
select
	a.ID_абонента
	,c.ID_оператора
	,b.дата_подключения
	,lead(b.дата_подключения)over(partition by a.ID_абонента order by b.дата_подключения) as дата_отключения
from [Номера абонентов]		a
inner join [История тарифов]	b on a.ID_абонента = b.ID_абонента
inner join Тарифы		c on b.ID_тарифа = c.ID_тарифа

а затем, в зависимости от ответа на вопрос в квоте, или просуммировать, или exists-ом проверить
1 ноя 19, 11:35    [22007914]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на T-SQL  [new]
Fastredialer
Member

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

все, понял, надо было еще один INNER JOIN сделать
точнее это все засунуть внутрь INNER JOIN
1 ноя 19, 12:09    [22007970]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить