Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на T-SQL / 5 сообщений из 5, страница 1 из 1
01.11.2019, 07:06
    #39883947
Fastredialer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на T-SQL
суть вопроса:
нужно вывести текущих абонентов, являющихся абонентами данного оператора более 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_оператора
...
Рейтинг: 0 / 0
01.11.2019, 11:20
    #39884100
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на T-SQL
Fastredialerсуть вопроса:
нужно вывести текущих абонентов, являющихся абонентами данного оператора более 5 лет

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
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 лет назад и сейчас являются его абонентами ?
...
Рейтинг: 0 / 0
01.11.2019, 11:23
    #39884109
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на T-SQL
courtВ табл.[История тарифов] с ПК какая-то лажа
Только один абонент в день может только подключиться чтоле ?

... эээ, это все 3-и поля ПК, - тогда замечание снимается
...
Рейтинг: 0 / 0
01.11.2019, 11:35
    #39884124
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на T-SQL
courtСуммарно, провели "на операторе" более 5-ти лет и сейчас являются его абонентами ?
Или первый раз подключались к этому оператору более 5 лет назад и сейчас являются его абонентами ?
вообщем, с этого можно начать
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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-ом проверить
...
Рейтинг: 0 / 0
01.11.2019, 12:09
    #39884163
Fastredialer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на T-SQL
Fastredialer,

все, понял, надо было еще один INNER JOIN сделать
точнее это все засунуть внутрь INNER JOIN
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на T-SQL / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]