powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Найти значение для нескольких диапазонов
17 сообщений из 17, страница 1 из 1
Найти значение для нескольких диапазонов
    #39701560
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите справиться с задачей: мне нужно следующий запрос
select count(sum) from users left JOIN transactions t on users.id=t.user_id
where DATE_FORMAT(birthday,"%Y")<"1960" AND t.status_id=2 AND t.content_type_id in(1,2,3)

выполнить для нескольких диапазонов: для первого, когда birthday<"1960" уже есть в моем примере, а нужно еще посчитать count(sum) для четырех диапазонов: DATE_FORMAT(birthday,"%Y") BETWEEN "1961" AND "1970",
DATE_FORMAT(birthday,"%Y") BETWEEN "1971",
(birthday,"%Y") BETWEEN "1981",
DATE_FORMAT(birthday,"%Y") >="2001"

и всё это сделать в одном запросе, как это реализовать с помощью case
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701577
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замените

COUNT(sum)

на COUNT(CASE WHEN DATE_FORMAT(birthday,'%Y')<'1960') THEN sum END)
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701578
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замените
Код: sql
1.
COUNT(sum)

на
Код: sql
1.
COUNT(CASE WHEN DATE_FORMAT(birthday,'%Y')<'1960') THEN sum END)

и соответственно выбросите условие из WHERE.
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701594
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо,Akina
Пишу так:
select COUNT(CASE WHEN DATE_FORMAT(birthday,"%Y")<"1960") THEN sum END),
COUNT(CASE WHEN DATE_FORMAT(birthday,"%Y") BETWEEN "1961" AND "1970" THEN sum END),
COUNT(CASE WHEN DATE_FORMAT(birthday,"%Y") BETWEEN "1971" AND "1980" THEN sum END),
COUNT(CASE WHEN DATE_FORMAT(birthday,"%Y") BETWEEN "1981" AND "1990" THEN sum END),
COUNT(CASE WHEN DATE_FORMAT(birthday,"%Y") BETWEEN "1991" AND "2000" THEN sum END),
COUNT(CASE WHEN DATE_FORMAT(birthday,"%Y") >="2001" THEN sum END)
from users left JOIN transactions t on users.id=t.user_id
where t.status_id=2 AND t.content_type_id in(1,2,3)

выдает ошибку....
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701631
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11выдает ошибку....Цитировать надо, а не констатировать...
Да и кавычки у тебя какие-то не SQL-ные...
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701632
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
когда я выполняю:
SELECT
count(case when DATE_FORMAT(birthday,"%Y") <="1960" then sum end) as "<=1960"
FROM users

пишет: неизвестный столбец sum
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701637
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в запросе, что в исходном сообщении - типа он известный?
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701640
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaЦитировать надо, а не констатировать...
Да и кавычки у тебя какие-то не SQL-ные...
а кавычки как раз правильные в моей версии на одинарные выдается ошибка...
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701643
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaА в запросе, что в исходном сообщении - типа он известный?

столбец sum есть в таблице users

P.S. я плохо разбираюсь в синтаксисе и у меня много ошибок в последовательности действий, но очень хочу разобраться в правилах написания запросов на практике
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701719
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11в моей версии на одинарные выдается ошибка...???

Знаете что... а присмотритесь-ка Вы повнимательнее к DBMS - точно ли это MySQL?
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701732
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinahatter11в моей версии на одинарные выдается ошибка...???

Знаете что... а присмотритесь-ка Вы повнимательнее к DBMS - точно ли это MySQL?

dbForgeStudioExpress for MySql 8.0.4.0

Но всё-таки, приблизительно,конструкция правильная этого запроса?
авторselect COUNT(CASE WHEN DATE_FORMAT(birthday,"%Y")<"1960") THEN sum END),
COUNT(CASE WHEN DATE_FORMAT(birthday,"%Y") BETWEEN "1961" AND "1970" THEN sum END),
COUNT(CASE WHEN DATE_FORMAT(birthday,"%Y") BETWEEN "1971" AND "1980" THEN sum END),
COUNT(CASE WHEN DATE_FORMAT(birthday,"%Y") BETWEEN "1981" AND "1990" THEN sum END),
COUNT(CASE WHEN DATE_FORMAT(birthday,"%Y") BETWEEN "1991" AND "2000" THEN sum END),
COUNT(CASE WHEN DATE_FORMAT(birthday,"%Y") >="2001" THEN sum END)
from users left JOIN transactions t on users.id=t.user_id
where t.status_id=2 AND t.content_type_id in(1,2,3)
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701737
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
наверное поняла ошибку, поле sum находится в таблице transactions...
подскажите как подкорректировать запрос...
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701742
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверное, надо переписать так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
  sum(case when DATE_FORMAT(birthday,"%Y") <="1960" then 1 else 0 end),
  sum(case when DATE_FORMAT(birthday,"%Y") BETWEEN "1961" AND "1970" then 1 else 0 end),
  sum(case when DATE_FORMAT(birthday,"%Y") BETWEEN "1971" AND "1980" then 1 else 0 end),
  sum(case when DATE_FORMAT(birthday,"%Y") BETWEEN "1981" AND "1990" then 1 else 0 end),
  sum(case when DATE_FORMAT(birthday,"%Y") BETWEEN "1991" AND "2000" then 1 else 0 end),
  sum(case when DATE_FORMAT(birthday,"%Y") BETWEEN "1991" AND "2000" then 1 else 0 end),
  sum(case when DATE_FORMAT(birthday,"%Y") >="2001" then 1 else 0 end)
  FROM users left join from users left JOIN transactions t on users.id=t.user_id
  where t.status_id=2 AND t.content_type_id in(1,2,3) and sum is not null



Завтра попробую запустить в программе
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701760
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11
Код: plsql
1.
 sum(case when DATE_FORMAT(birthday,"%Y") BETWEEN "1971" AND "1980" then 1 else 0 end),

Это можно упростить:
Код: sql
1.
sum(YEAR(birthday) BETWEEN 1971 AND 1980),
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701787
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hatter11
Код: plsql
1.
  FROM users left join from users left JOIN transactions t on users.id=t.user_id



... а это исправить
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39701848
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
paverhatter11
Код: plsql
1.
  FROM users left join from users left JOIN transactions t on users.id=t.user_id



... а это исправитьну да, спасибо, это опечатка, поскольку писала не в программе...
...
Рейтинг: 0 / 0
Найти значение для нескольких диапазонов
    #39702208
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
теперь не соображу, каким образом в результате посчитать количество не повторяющихся user_id при выбранных условиях в таблице transactions.
Пока что вывожу так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
  sum(case when DATE_FORMAT(birthday,"%Y") <="1960" then 1 else 0 end) as "<1960",
  sum(case when DATE_FORMAT(birthday,"%Y") BETWEEN "1961" AND "1970" then 1 else 0 end) as "1961<ДР<1970",
  sum(case when DATE_FORMAT(birthday,"%Y") BETWEEN "1971" AND "1980" then 1 else 0 end) as "1971<ДР<1980",
  sum(case when DATE_FORMAT(birthday,"%Y") BETWEEN "1981" AND "1990" then 1 else 0 end) as "1981<ДР<1990",
  sum(case when DATE_FORMAT(birthday,"%Y") BETWEEN "1991" AND "2000" then 1 else 0 end) as "1991<ДР<2000",
  sum(case when DATE_FORMAT(birthday,"%Y") >="2001" then 1 else 0 end) 
  FROM users,transactions t where users.id=t.user_id
  and t.status_id=2 AND t.content_type_id in(1,2,3) and sum is not null
  GROUP BY user_id


и потом выгружаю таблицу и считаю количество строк с ненулевым значением.

Но как запрос построить чтобы он выводил это количество?? думаю, без вложенного запроса не обойтись, подскажите плиз как это сделать....
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Найти значение для нескольких диапазонов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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