SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.04.2023 12:07:13

S_Gur
Участник
Зарегистрирован: 25.04.2023
Сообщений: 5

Функция или вложенный запрос

Доброго времени суток. Задача вкратце такая. Есть некий список клиентов. Каждый месяц у этого клиента может быть 0, 1 или несколько неких услуг. Нужно сделать отчет за 12 месяцев, в котором будет имя клиента и список этих услуг в строку - с использованием функции Group_Concat. Запрос на список этих услуг на каждого клиента на заданный месяц тоже не простой - из двух таблиц. Отсюда вопрос: как оптимальнее будет организовать представление - обычный селект (соответственно, с подключением 12 раз по две этих таблицы в секцию From), вложенные запросы на каждый месяц или функция, которая принимает в качестве параметра клиента и месяц и возвращает строку услуг через какой-то сепаратор

Неактивен

 

#2 26.04.2023 19:31:04

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Функция или вложенный запрос

Функция тоже будет делать какой-то запрос. Не ясно почему нельзя сделать запрос за год по аналогии за месяц, т.е. 1 раз обратиться к двум таблицам.
Сделайте тестовый пример:
create table таблиц
и небольшой набор данных в виде insert into
тогда можно будет посоветовать что-то определенное.

Неактивен

 

#3 26.04.2023 20:26:02

S_Gur
Участник
Зарегистрирован: 25.04.2023
Сообщений: 5

Re: Функция или вложенный запрос

vasya написал:

Функция тоже будет делать какой-то запрос. Не ясно почему нельзя сделать запрос за год по аналогии за месяц, т.е. 1 раз обратиться к двум таблицам.
Сделайте тестовый пример:
create table таблиц
и небольшой набор данных в виде insert into
тогда можно будет посоветовать что-то определенное.

У меня нет месяцев и годов. У меня есть периоды - номер месяца начала и номер месяца окончания. Номер месяца рассчитывается по формуле [Month] - 1 + ([Year] - 1) * 12. Когда мне надо получить значение на заданный месяц, я ищу его по условию [NumMonth] Between [NumMonthBegin] And [NumMonthEnd]. А с учетом, что мне нужно выдать информацию за весь год, в данной структуре другого варианта, как 12 раз вызывать эту формулу, я не вижу. Вопрос только, как это сделать оптимальнее

Отредактированно S_Gur (26.04.2023 20:26:25)

Неактивен

 

#4 26.04.2023 22:52:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Функция или вложенный запрос

Для года будет условие:
[номер месяца начала года] Between [NumMonthBegin] And [NumMonthEnd]
or
[номер месяца конца года] Between [NumMonthBegin] And [NumMonthEnd]
or
([номер месяца начала года] > [NumMonthBegin] And [номер месяца конца года] < [NumMonthEnd])

Неактивен

 

#5 26.04.2023 23:06:32

S_Gur
Участник
Зарегистрирован: 25.04.2023
Сообщений: 5

Re: Функция или вложенный запрос

И что мне это дает? [NumMonthBegin] и [NumMonthEnd] - это поля в таблице, указывающие на период действия данной записи. [номер месяца начала года] и [номер месяца конца года] - такой информации у меня нет. В запрос передается только один месяц, для которого я ищу запись, в период действия которой этот месяц попадает. Отсюда вопрос:чем мой один Between хуже вашей конструкции?

Неактивен

 

#6 26.04.2023 23:19:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Функция или вложенный запрос

[номер месяца начала года] и [номер месяца конца года] вы можете рассчитать аналогично тому как делаете для  [NumMonth]  по формуле [Month] - 1 + ([Year] - 1) * 12.
Я предлагаю передавать в запрос 2 значения - начало года и конец года, чтобы одним разом найти записи для которых период действия услуги попадает в заданный год.
Это будет лучше, чем 12 раз дублировать запрос, вычисляя для каждого месяца, а потом суммируя данные.

Неактивен

 

#7 27.04.2023 06:16:06

S_Gur
Участник
Зарегистрирован: 25.04.2023
Сообщений: 5

Re: Функция или вложенный запрос

А, я понял. Нет, я не суммирую данные. Я показываю каждое месячное значение. Мне все 12 нужны по отдельности

Неактивен

 

#8 27.04.2023 09:58:10

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Функция или вложенный запрос

Т.е. список услуг по каждому месяцу отдельно в течении года?

Ответ на исходный запрос - нужно проверять экспериментально. Если мало данных, то можно нагенерить тестовых.
Кроме того проверьте вариант когда выбираются все данные за год, а потом группируются по месяцам (понадобится доп таблица с номерами месяцов).

Неактивен

 

#9 27.04.2023 12:13:05

S_Gur
Участник
Зарегистрирован: 25.04.2023
Сообщений: 5

Re: Функция или вложенный запрос

vasya написал:

Т.е. список услуг по каждому месяцу отдельно в течении года?

Ответ на исходный запрос - нужно проверять экспериментально. Если мало данных, то можно нагенерить тестовых.
Кроме того проверьте вариант когда выбираются все данные за год, а потом группируются по месяцам (понадобится доп таблица с номерами месяцов).

И это я сделать не могу. У меня в записи лежит период ее действия - месяц и год начала и месяц и год окончания - причем, в виде вышеописанных номеров месяца, а не отдельно месяцем и годом. Поскольку период может быть, теоретически, от января 1900-го года до декабря 2500-го, напрямую сделать выборку нельзя - все равно считать надо

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson