Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 47

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

09.10.2014, 16:48. Показов 2433. Ответов 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
1654 / 1153 / 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru