Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Найти значение для нескольких диапазонов  [new]
hatter11
Member

Откуда:
Сообщений: 38
Помогите справиться с задачей: мне нужно следующий запрос
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
12 сен 18, 15:36    [21672339]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 17886
Замените

COUNT(sum)

на COUNT(CASE WHEN DATE_FORMAT(birthday,'%Y')<'1960') THEN sum END)
12 сен 18, 15:53    [21672370]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 17886
Замените
COUNT(sum)
на
COUNT(CASE WHEN DATE_FORMAT(birthday,'%Y')<'1960') THEN sum END)
и соответственно выбросите условие из WHERE.
12 сен 18, 15:54    [21672371]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
hatter11
Member

Откуда:
Сообщений: 38
Спасибо,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)

выдает ошибку....
12 сен 18, 16:08    [21672407]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 17886
hatter11
выдает ошибку....
Цитировать надо, а не констатировать...
Да и кавычки у тебя какие-то не SQL-ные...
12 сен 18, 16:37    [21672463]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
hatter11
Member

Откуда:
Сообщений: 38
когда я выполняю:
SELECT
count(case when DATE_FORMAT(birthday,"%Y") <="1960" then sum end) as "<=1960"
FROM users

пишет: неизвестный столбец sum
12 сен 18, 16:38    [21672465]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 17886
А в запросе, что в исходном сообщении - типа он известный?
12 сен 18, 16:40    [21672470]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
hatter11
Member

Откуда:
Сообщений: 38
Akina
Цитировать надо, а не констатировать...
Да и кавычки у тебя какие-то не SQL-ные...

а кавычки как раз правильные в моей версии на одинарные выдается ошибка...
12 сен 18, 16:42    [21672474]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
hatter11
Member

Откуда:
Сообщений: 38
Akina
А в запросе, что в исходном сообщении - типа он известный?


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

P.S. я плохо разбираюсь в синтаксисе и у меня много ошибок в последовательности действий, но очень хочу разобраться в правилах написания запросов на практике
12 сен 18, 16:49    [21672481]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 17886
hatter11
в моей версии на одинарные выдается ошибка...
???

Знаете что... а присмотритесь-ка Вы повнимательнее к DBMS - точно ли это MySQL?
12 сен 18, 19:25    [21672697]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
hatter11
Member

Откуда:
Сообщений: 38
Akina
hatter11
в моей версии на одинарные выдается ошибка...
???

Знаете что... а присмотритесь-ка Вы повнимательнее к 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)
12 сен 18, 20:38    [21672778]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
hatter11
Member

Откуда:
Сообщений: 38
наверное поняла ошибку, поле sum находится в таблице transactions...
подскажите как подкорректировать запрос...
12 сен 18, 21:11    [21672801]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
hatter11
Member

Откуда:
Сообщений: 38
Наверное, надо переписать так:
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


Завтра попробую запустить в программе
12 сен 18, 21:28    [21672813]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
miksoft
Member

Откуда:
Сообщений: 36927
hatter11
 sum(case when DATE_FORMAT(birthday,"%Y") BETWEEN "1971" AND "1980" then 1 else 0 end),
Это можно упростить:
sum(YEAR(birthday) BETWEEN 1971 AND 1980),
12 сен 18, 23:09    [21672879]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
paver
Member

Откуда: Томск
Сообщений: 102
hatter11
  FROM users left join from users left JOIN transactions t on users.id=t.user_id


... а это исправить
13 сен 18, 05:34    [21672990]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
hatter11
Member

Откуда:
Сообщений: 38
paver
hatter11
  FROM users left join from users left JOIN transactions t on users.id=t.user_id


... а это исправить
ну да, спасибо, это опечатка, поскольку писала не в программе...
13 сен 18, 09:05    [21673085]     Ответить | Цитировать Сообщить модератору
 Re: Найти значение для нескольких диапазонов  [new]
hatter11
Member

Откуда:
Сообщений: 38
теперь не соображу, каким образом в результате посчитать количество не повторяющихся user_id при выбранных условиях в таблице transactions.
Пока что вывожу так:
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

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

Но как запрос построить чтобы он выводил это количество?? думаю, без вложенного запроса не обойтись, подскажите плиз как это сделать....
13 сен 18, 16:06    [21673830]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить