0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 47

Объединение запросов на сумму тарифов и сумму подписок

09.10.2014, 16:48. Показов 2476. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сумма за тариф по месяцам
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
WITH CTE_table (name, January, February, March)
AS
(
SELECT tarif.name,
(CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=01 THEN SUM(tarif.tsena) ELSE 0 END) AS January,
(CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=02 THEN SUM(tarif.tsena) ELSE 0 END) AS February,
(CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=03 THEN SUM(tarif.tsena) ELSE 0 END)  AS March
FROM tarif INNER JOIN tarif_po_dog ON tarif.id_tarif = tarif_po_dog.id_tarif
WHERE YEAR(tarif_po_dog.date_podkl_tarifa) = 2014
GROUP BY tarif.name
)
SELECT name, SUM(January) AS Jan, SUM(February) AS Feb, SUM(March) AS Mar
FROM CTE_Table
GROUP BY name
Выполнение скрин 1

Сумма за подписку по месяцам
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
WITH CTE_table (name, January, February, March)
AS
(
SELECT podpiski.name,
(CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=01 THEN SUM(podpiski.tsena) ELSE 0 END) AS January,
(CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=02 THEN SUM(podpiski.tsena) ELSE 0 END) AS February,
(CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=03 THEN SUM(podpiski.tsena) ELSE 0 END)  AS March
FROM podpiski INNER JOIN podp_po_dog ON podpiski.id_podpiski = podp_po_dog.id_podpiski
WHERE YEAR(podp_po_dog.data_nachala_podpiski) = 2014
GROUP BY podpiski.name
)
 
SELECT name, SUM(January) AS Jan, SUM(February) AS Feb, SUM(March) AS Mar
FROM CTE_Table
GROUP BY name
Выполнение скрин 2

Помогите сделать всё в один запрос, чтобы сумма за тариф+ сумма за подписку по месяцам. Должно получиться как на скрине 3, только место вопросиков сумма.

Я сделал такой запрос:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WITH CTE_table (name, January, February, March)
AS
(
SELECT tarif.name,
(CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=01 AND MONTH(MAX(podp_po_dog.data_nachala_podpiski))=01
 THEN SUM(tarif.tsena) ELSE SUM(podpiski.tsena) END) AS January,
(CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=02 AND MONTH(MAX(podp_po_dog.data_nachala_podpiski))=02
 THEN SUM(tarif.tsena) ELSE SUM(podpiski.tsena) END) AS February,
(CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=03 AND MONTH(MAX(podp_po_dog.data_nachala_podpiski))=03
 THEN SUM(tarif.tsena) ELSE SUM(podpiski.tsena) END)  AS March
FROM tarif INNER JOIN tarif_po_dog ON tarif.id_tarif = tarif_po_dog.id_tarif, 
podpiski INNER JOIN podp_po_dog ON podpiski.id_podpiski = podp_po_dog.id_podpiski
WHERE YEAR(tarif_po_dog.date_podkl_tarifa)= 2014 AND YEAR(podp_po_dog.data_nachala_podpiski) = 2014
GROUP BY tarif.name
)
 
SELECT name, SUM(January) AS Jan, SUM(February) AS Feb, SUM(March) AS Mar
FROM CTE_Table
GROUP BY name
Ничего не вышло, получается как на скрине 4, все цифры одинаковые.
Миниатюры
Объединение запросов на сумму тарифов и сумму подписок   Объединение запросов на сумму тарифов и сумму подписок   Объединение запросов на сумму тарифов и сумму подписок  

Изображения
 
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.10.2014, 16:48
Ответы с готовыми решениями:

Подсчитать сумму тарифов за каждый месяц
Подсчитать сумму тарифов за каждый месяц, вывести строка - название тарифа, столбец - Январь, Февраль, Март. Помоги подлатать запрос ...

Вывести сумму тарифов за месяцы в диапазоне [a,b]
Помогите, пожалуйста, с Excel воевать, не пойму с какой стороны подойти - надо вывести сумму тарифов за месяцы в диапазоне . В общем надо,...

Найти сумму (объединение) множеств
Помогите пожалуйста дописать программу... Даны два множества заданные в виде массивов А(I) и В(I); I=1,2,..,10. Найти сумму (об’единение)...

11
 Аватар для nixon93nixon
63 / 63 / 21
Регистрация: 08.02.2013
Сообщений: 262
09.10.2014, 17:13
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
WITH CTE_rates(name, January, February, March)
AS
(
SELECT tarif.name,
(CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=01 THEN SUM(tarif.tsena) ELSE 0 END) AS January,
(CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=02 THEN SUM(tarif.tsena) ELSE 0 END) AS February,
(CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=03 THEN SUM(tarif.tsena) ELSE 0 END)  AS March
FROM tarif INNER JOIN tarif_po_dog ON tarif.id_tarif = tarif_po_dog.id_tarif
WHERE YEAR(tarif_po_dog.date_podkl_tarifa) = 2014
GROUP BY tarif.name
)
 
WITH CTE_subscrition (name, January, February, March)
AS
(
SELECT podpiski.name,
(CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=01 THEN SUM(podpiski.tsena) ELSE 0 END) AS January,
(CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=02 THEN SUM(podpiski.tsena) ELSE 0 END) AS February,
(CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=03 THEN SUM(podpiski.tsena) ELSE 0 END)  AS March
FROM podpiski INNER JOIN podp_po_dog ON podpiski.id_podpiski = podp_po_dog.id_podpiski
WHERE YEAR(podp_po_dog.data_nachala_podpiski) = 2014
GROUP BY podpiski.name
)
 
SELECT name, SUM(rates.January + sub.January) AS Jan, SUM(rates.February + sub.February) AS Feb, SUM(rates.March + sub.March) AS Mar
FROM CTE_Rates rates INNER JOIN CTE_Subscription sub ON sub.name = rates.name
GROUP BY name
1
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 47
09.10.2014, 17:23  [ТС]
Сообщение 156, уровень 15, состояние 1, строка 13
Неправильный синтаксис около ключевого слова "WITH".
Сообщение 319, уровень 15, состояние 1, строка 13
Неправильный синтаксис около ключевого слова "with". Если эта инструкция является обобщенным табличным выражением, предложением xmlnamespaces или предложением в контексте отслеживания изменений, предыдущую инструкцию необходимо завершить точкой с запятой.

Ставил ; всё равно ошибка.
0
 Аватар для nixon93nixon
63 / 63 / 21
Регистрация: 08.02.2013
Сообщений: 262
09.10.2014, 17:34
что-то я опростофилился
два CTE нельзя

вот так вот можно
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
WITH CTE_rates(name, January, February, March)
AS
(
SELECT tarif.name,
(CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=01 THEN SUM(tarif.tsena) ELSE 0 END) AS January,
(CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=02 THEN SUM(tarif.tsena) ELSE 0 END) AS February,
(CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=03 THEN SUM(tarif.tsena) ELSE 0 END)  AS March
FROM tarif INNER JOIN tarif_po_dog ON tarif.id_tarif = tarif_po_dog.id_tarif
WHERE YEAR(tarif_po_dog.date_podkl_tarifa) = 2014
GROUP BY tarif.name
)
 
 
SELECT name, SUM(rates.January + sub.January) AS Jan, SUM(rates.February + sub.February) AS Feb, SUM(rates.March + sub.March) AS Mar
FROM CTE_Rates rates INNER JOIN 
(
    SELECT podpiski.name,
    (CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=01 THEN SUM(podpiski.tsena) ELSE 0 END) AS January,
    (CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=02 THEN SUM(podpiski.tsena) ELSE 0 END) AS February,
    (CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=03 THEN SUM(podpiski.tsena) ELSE 0 END)  AS March
    FROM podpiski INNER JOIN podp_po_dog ON podpiski.id_podpiski = podp_po_dog.id_podpiski
    WHERE YEAR(podp_po_dog.data_nachala_podpiski) = 2014
    GROUP BY podpiski.name
) AS Sub ON sub.name = rates.name
GROUP BY name
1
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 47
09.10.2014, 17:42  [ТС]
Не пойму в чём дело:

Сообщение 209, уровень 16, состояние 1, строка 25
Неоднозначное имя столбца "name".
Сообщение 209, уровень 16, состояние 1, строка 14
Неоднозначное имя столбца "name".
0
 Аватар для nixon93nixon
63 / 63 / 21
Регистрация: 08.02.2013
Сообщений: 262
09.10.2014, 17:55
в главном SELECT укажи принадлежность
типа
SQL
1
SELECT rates.name
не понимает с какой таблицы поле брать
в GROUP BY тоже самое
1
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 47
09.10.2014, 18:06  [ТС]
Так я делал. И в главном SELECT и в главном GROUP BY меня на
SQL
1
2
SELECT rates.name
GROUP BY rates.name
Запрос выполнялся так:
Миниатюры
Объединение запросов на сумму тарифов и сумму подписок  
0
 Аватар для nixon93nixon
63 / 63 / 21
Регистрация: 08.02.2013
Сообщений: 262
09.10.2014, 18:14
так слушай, у тебя же подписки и тарифы совсем разные вещи, я сразу подумал, они одинаковые имена имеют
в таком случае возможна выборка без поля NAME, то есть просто в одной строке суммы по месяцам

тогда так
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT SUM(January) AS Jan, SUM(February) AS Feb, SUM(March) AS Mar
FROM 
(
    SELECT 
    (CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=01 THEN SUM(podpiski.tsena) ELSE 0 END) AS January,
    (CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=02 THEN SUM(podpiski.tsena) ELSE 0 END) AS February,
    (CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=03 THEN SUM(podpiski.tsena) ELSE 0 END)  AS March
    FROM podpiski INNER JOIN podp_po_dog ON podpiski.id_podpiski = podp_po_dog.id_podpiski
    WHERE YEAR(podp_po_dog.data_nachala_podpiski) = 2014
    
    UNION ALL   
    
    SELECT 
    (CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=01 THEN SUM(tarif.tsena) ELSE 0 END) AS January,
    (CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=02 THEN SUM(tarif.tsena) ELSE 0 END) AS February,
    (CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=03 THEN SUM(tarif.tsena) ELSE 0 END)  AS March
    FROM tarif INNER JOIN tarif_po_dog ON tarif.id_tarif = tarif_po_dog.id_tarif
    WHERE YEAR(tarif_po_dog.date_podkl_tarifa) = 2014
    
) AS SubAndRates
1
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 47
09.10.2014, 18:38  [ТС]
В этом запросе выводится всего по тарифам и подпискам, по месяцам.

А нужно, чтобы выводилось как на скрине, а место вопросиков суммы



Часть диаграммы:
0
 Аватар для nixon93nixon
63 / 63 / 21
Регистрация: 08.02.2013
Сообщений: 262
09.10.2014, 20:03
Лучший ответ Сообщение было отмечено GoodNight как решение

Решение

понимаешь, даже по твоей диаграмме видно, что "Тариф" и "Подписка" это разные сущности, чисто логически неправильно их считать за одно и то же
максимум можно вывести суммы в одном запросе по тарифам, а за ними по подпискам

что-то типа того

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    SELECT podpiski.name,
    (CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=01 THEN SUM(podpiski.tsena) ELSE 0 END) AS January,
    (CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=02 THEN SUM(podpiski.tsena) ELSE 0 END) AS February,
    (CASE WHEN MONTH(MIN(podp_po_dog.data_nachala_podpiski))=03 THEN SUM(podpiski.tsena) ELSE 0 END)  AS March
    FROM podpiski INNER JOIN podp_po_dog ON podpiski.id_podpiski = podp_po_dog.id_podpiski
    WHERE YEAR(podp_po_dog.data_nachala_podpiski) = 2014
   GROUP BY podpiski.name    
 
 
    UNION ALL   
    
    SELECT tarif.name,
    (CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=01 THEN SUM(tarif.tsena) ELSE 0 END) AS January,
    (CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=02 THEN SUM(tarif.tsena) ELSE 0 END) AS February,
    (CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=03 THEN SUM(tarif.tsena) ELSE 0 END)  AS March
    FROM tarif INNER JOIN tarif_po_dog ON tarif.id_tarif = tarif_po_dog.id_tarif
    WHERE YEAR(tarif_po_dog.date_podkl_tarifa) = 2014
    GROUP BY tarif.name
1
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 47
09.10.2014, 21:00  [ТС]
Да, я понял

А смотри, у меня структура такая: id_dogovor_lk подключил id_tarif и id_podpiski
Можно как-нибудь сделать типо Тариф связан с Подпиской через Договор
и
сумму тарифа плюсовать только со связанной подпиской по договору


ИЛИ

я сделал такой запрос:
SQL
1
2
3
4
5
6
7
8
9
10
SELECT tarif.name+podpiski.name,
(CASE WHEN MONTH(MIN(tarif_po_dog.date_podkl_tarifa))=01 AND MONTH(MIN(podp_po_dog.data_nachala_podpiski))=01 
THEN SUM(tarif.tsena)+SUM(podpiski.tsena) ELSE 0  END) AS 'Январь',
(CASE WHEN MONTH(MIN(tarif_po_dog.date_podkl_tarifa))=02 AND MONTH(MIN(podp_po_dog.data_nachala_podpiski))=02 
THEN SUM(tarif.tsena)+SUM(podpiski.tsena) ELSE 0  END) AS 'Февраль',
(CASE WHEN MONTH(MAX(tarif_po_dog.date_podkl_tarifa))=03 AND MONTH(MIN(podp_po_dog.data_nachala_podpiski))=03  
THEN SUM(tarif.tsena)+SUM(podpiski.tsena) ELSE 0  END) AS 'Март'
FROM tarif INNER JOIN tarif_po_dog ON tarif.id_tarif = tarif_po_dog.id_tarif, podpiski INNER JOIN podp_po_dog ON podpiski.id_podpiski = podp_po_dog.id_podpiski 
WHERE YEAR(tarif_po_dog.date_podkl_tarifa) = 2014 AND YEAR(podp_po_dog.data_nachala_podpiski) = 2014
GROUP BY tarif.name+podpiski.name;
Получается:


Вроде бы всё правильно, но мне нужно это объединить так:
0
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
10.10.2014, 09:59
Цитата Сообщение от nixon93nixon Посмотреть сообщение
два CTE нельзя
это кто сказал?
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
with cte1(id) as
(
    select 1 
    union
    select 2
), 
cte2(id) as
(
    select 1 
    union
    select 4
)
select * 
from cte1 
join cte2 on cte1.id=cte2.id
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.10.2014, 09:59
Помогаю со студенческими работами здесь

Найти сумму положительных и сумму нечетных членов последовательности. Вывести ту сумму, которая по модулю меньше
вот задачка одна не понял как вывевсти оттуда отрицательные... Программа запрашивает кол-во чисел.,затем вводит целые числа в...

Ввести тип работ и вывести начисленную сумму, сумму налога и сумму к выдаче
Пусть оплата работ зависит от типа выполненной работы или вида предпринимательской деятельности (P1, P2, P3) и начисляется по формуле Z...

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

Даны два множества в виде массивов. Найти сумму (объединение) множеств
Даны два множества заданные в виде массивов А(I) и В(I); I=1,2,..,10. Найти сумму (об’единение) множеств. C(J) - сумма двух множеств есть...

Объединение запросов
Доброго времени суток! Помогите связать запросы. В первом считается сумма отгрузок по дням текущего месяца, во втором - итоговые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru