Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Выборка данных из таблицы по колонке X исключая некоторые значения из колонки Y

Не могу разобраться с SQL запросом ввиду своей дилетантности. Условно - нужно выбрать записи из таблицы по колонке X, допустим, колонка состоит только из 0 и 1, я выбираю только те, что равны 1, с этим понятно. Но в то же время в колонке Y множество различных значений, допустим, названия улиц, так же присутствуют и пустые ячейки.
Так вот, мне нужно выбрать записи исключая несколько названий улиц, например 4 улицы. Как мне это организовать?
Ответ:
T-SQL
1
2
3
4
5
6
7
select
 t.*
from
 Таблица t
where
 t.X = ... and
 not exists(select * from (values ('Улица1'), ('Улица2'), ..., ('УлицаN')) a(Y) where a.Y = t.Y);
Вопрос: MySQL, максимальное значение из нескольких полей?

Такая, казалось бы простая задача. Есть таблица, в ней 8 интересующих меня полей. Нужно написать запрос, который бы выбирал из каждой записи максимальное значение из этих восьми полей. Удивительно, но никакой подходящей функции не нашел, а делать с помощью CASE как-то уж очень громоздко.
Ответ:
Спасибо, то как раз то, что искал и сам найти не смог.
Вопрос: Значение одного столбца = значению другого столбца

SELECT FROM WHERE значение одного столбца = значению другого столбца ;
Как построить этот запрос ?
SQL
1
SELECT FamilyName, Name, Patronymic, ClockNumber FROM Storekeepers WHERE Storekeepers.CodeStorekeeper =  'AccountingForDispensingProduct.CodeStorekeeper' ORDER BY FamilyName;
Это будет верно ?
Ответ:
Сообщение от Maksssssss
значение одного столбца = значению другого столбца
То, что в апострофах - это не имя колонки, а строковый литерал. Плюс, если у тебя другой столбец из другой таблицы, то эта таблица тоже д.б. упомянута во FROM.
Вопрос: Значение стобца на основе максимального значения в строке выборки.

Тему назвал как мог, сильно не пинайте. Объяснить задачу коротко не получается.
Есть таблицы:
users (id_user, tariff, всякие другие поля)
corporations (id_corp, corp, tariff, всякие другие поля)
corp_users (id, corp, user)
parties (id_party, party, tariff, всякие другие поля)
party_users (id, party, user)
tariffs (id_tariff, tariff, tariff_rights_user, всякие другие поля)

Тарифы задают права пользователя, права корпорации и права партии (три столбца, интересует только первый). Причём корпоративные тарифы и партийные тарифы могут повышать права пользователя. То есть для определения прав пользователя надо выбрать максимальное значение из трёх. Это у меня получилось сделать. Но теперь не пойму можно ли в этом же запросе или отдельно одним запросом, определить по какому тарифу назначены права? Ниже запрос по которому можно вывести таблицу пользователей с окончательными правами. Собственно в идеале вывести третий столбец tariff_name - которые будет равен t_user.tariff, t_corp.tariff или t_party.tariff в зависимости от того что выбрано GREATEST.

SELECT users.user, GREATEST(t_user.tariff_rights_user, t_corp.tariff_rights_user, t_party.tariff_rights_user) FROM users
inner join tariffs t_user on t_user.id_tariff=users.tariff
inner join corporation_users on corporation_users.user=users.id_user
inner join corporations on corporations.id_corp=corporation_users.corp
inner join tariffs t_corp on t_corp.id_tariff=corporations.corp_tariff
inner join party_users on party_users.user=users.id_user
inner join parties on party_users.party=parties.id_party
inner join tariffs t_party on t_party.id_tariff=parties.party_tariff

Это вообще реально сделать или проще не насиловать себе мозг и на PHP это сделать с несколькими запросами?
Ответ: javajdbc,

Партии и корпорации могут быть несколько, но там свои тонкости в этих случаях. конкретно в этот запрос партия или корпорация попадать будет только одна! ) Просто не хочу лишней информацией нагружать людей, мне и так очень сильно помогли, ибо о существовании CASE в селекте я даже не догадывался. ))
Логика то правильно срабатывает, но было подозрение, что можно упростить запрос. И как оказалось действительно можно. Вместо подзапросов вполне можно использовать имена столбцов в кейсах. Сразу пытался так сделать, но почему-то мускул на меня ругался, в итоге сделал подзапросы, но вчера попробовал ещё раз с именами столбцов и всё отлично сработало.
Спасибо всем!
Вопрос: Выборка данных по максимальному значению одного из полей

Такой код
Код SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
DISTINCT wt.wayid,
wt1.Info AS 'Улица',
wt2.Info AS 'Дом'
FROM 
dbo.tWayTag wt
LEFT JOIN tWayTag wt1 ON wt1.WayId=wt.WayId AND wt1.Typ=15
LEFT JOIN tWayTag wt2 ON wt2.WayId=wt.WayId AND wt2.Typ=13
WHERE 
wt1.Info IS NOT NULL
AND
wt2.Info IS NOT NULL
ORDER BY wt.wayid
даёт такую выборку

27867797 Новоалексеевская улица 11
27867798 Новоалексеевская улица 9
27867800 Староалексеевская улица 18 с1
75396629 Новоалексеевская улица 16 с20
82293814 Зубарев переулок 15к2
84503557 Новоалексеевская улица 15
84503558 Новоалексеевская улица 17
88126853 Новоалексеевская улица 13 к1
91241576 Зубарев переулок 15к1
92508978 Староалексеевская улица 3
99698177 Староалексеевская улица 5
99698184 Староалексеевская улица 28
124540740 Новоалексеевская улица 13 к1
124540741 Староалексеевская улица 24
124540743 Староалексеевская улица 24
124540744 Староалексеевская улица 24
124540746 Староалексеевская улица 7
124540747 Староалексеевская улица 9
124540749 Новоалексеевская улица 11

А нужно

"
124540741 Староалексеевская улица 24
124540743 Староалексеевская улица 24
124540744 Староалексеевская улица 24
"

в силу того, что данные во втором и третьем поле одинаковые, из этих трёх записей оставить ту, у которой
значение первого поля максимальное в пределах этих трёх записей.
Ответ:
Код T-SQL
1
2
3
4
5
6
7
8
9
SELECT TOP(1) WITH TIES
 wt.wayid,
 wt1.Info AS 'Улица',
 wt2.Info AS 'Дом'
FROM dbo.tWayTag wt
JOIN dbo.tWayTag wt1 ON wt1.WayId=wt.WayId AND wt1.Typ=15
JOIN dbo.tWayTag wt2 ON wt2.WayId=wt.WayId AND wt2.Typ=13
WHERE wt1.Info IS NOT NULL AND wt2.Info IS NOT NULL
ORDER BY ROW_NUMBER() OVER(PARTITION BY wt1.Info,wt2.Info ORDER BY wt.wayid DESC);
Вопрос: Перейти к записи с максимальным значением кода счетчика

Всем Здравия и благополучия.
При внесении данных в форму в новую запись с последующим обновлением происходит сортировка в источнике записей формы. Типа все сортируется по алфавиту и перемешивается не в том порядке в каком вводится.
Ни как не получается выполнить команду
- Перейти к записи с максимальным значением кода счетчика.
Где то видел что то подобное, но ни как не найду и у самого чёй та ни как не придумается (видимо из за слабых знаний синтакси'соф)
Помогите люди добрые, Подскажите как быть.
Ответ:
Сообщение от mobile
...Надо переделать код...
mobile - Низкий поклон, выручил. Супер.
Единственно, когда первый раз спецом забиваешь не существующие данные, то выскакивает такое пугающее окошко, а при повторных вводах не выскакивает, а только звуками стращает, пока БД по новой не откроещь.
Сообщение от mobile
...Если хочется, чтобы написанное вставилось в фамилию, снять коммент...
Именно в данном случае ФИО разбито на 3 поля - Фамилию, Имя, Отчество и по этому что бы не портачить, типа ввести новое полное ФИО только в поле - Фамилия и попросил именно про переход на новую запись.
Еще раз ОГРОМНОЕ СПАСИБО, я ваш на веки.
Вопрос: Выбрать минимальное и максимальное значения в каждой группе

Дана таблица (во вложении). Помогите, пожалуйста, выбрать минимальное и максимальное значения по НОМЕР знаков в каждой группе ГРУППА. (результат тоже во вложении)
Ответ: wolf1024, как вариант:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT cel.ZZ AS "Группа", 
       cel.ZX AS "Максимальный знак", 
       cal.ZV AS "Минимальный знак" 
FROM
(SELECT w.group_id AS ZZ, w.sigh AS ZX FROM test_f w JOIN  
(SELECT q.group_id AS AA, MAX(q.number_q) AS AD  FROM test_f q GROUP BY q.group_id) vel
ON w.group_id=vel.AA AND w.number_q=vel.AD) cel
JOIN
(SELECT w.group_id AS ZC, w.sigh AS ZV FROM test_f w JOIN  
(SELECT q.group_id AS QQ, MIN(q.number_q) AS QW FROM test_f q GROUP BY q.group_id) val
ON w.group_id=val.QQ AND w.number_q=val.QW) cal
ON cel.ZZ=cal.ZC
ORDER BY cel.ZZ ASC
Вопрос: Найти максимальное значение в тексте

Всем, добрый день.

В таблице "Товары" есть столбец "XML_ID" который содержит идентификаторы товаров для внешней системы. Добавление товаров производится из одноименной формы "Товары" на которой есть кнопка (кнопка12). В форме, при нажатии на кнопку необходимо найти максимальное значение XML_ID и прибавить к нему 1 и вывести в поле "XML_ID".

Примеры идентификаторов:

prod_1
prod_2
prod_3
...
prod_n

Максимум нашел с помощью функции DMax, но не знаю как прибавить 1.

Подскажите пожалуйста.
Ответ:
Сообщение от boby104
так?
То, что нужно

Сообщение от boby104
а то не очень понятно что же вы хотите получить
Прошу прощения запутался уже)))

Сообщение от boby104
Вы должны понимать, что присвоить значение полю на форме - это не равносильно записать данные в таблицу
а запросы и функции выбирают данные только из таблиц
Это я понимаю. Хотел сделать, чтобы номер генерировался при добавлении новой записи одной кнопкой.

Спасибо Вам большое. С наступающим!!!
Вопрос: Определение максимального значения подзапроса

Имеется таблица
id (int) | title (varchar) | author (int) | filename (varchar) | views (int) |
Получите максимальное значение отношения "сумма просмотров фотографий одного автора / количество фотографий одного автора".
я создал такой запрос для получения значения "сумма просмотров фотографий одного автора / количество фотографий одного автора":
SQL
1
SELECT SUM(views) / COUNT(*) FROM gallery GROUP BY author
это выводит список этого выражения sum(views) / count(*)
А как теперь получить максимальное значение из этого результата?

Добавлено через 59 секунд
такое не работает
SQL
1
SELECT SUM(views) / COUNT(*) AS num FROM gallery GROUP BY author HAVING MAX(num)
Ответ:
Сообщение от phpk
Ваш код выдаёт результат 24.000
а этот код выдаёт 40.000
Не знаю, продебаж, выведи все значения
MySQL
1
2
3
 select  `avg` from (
  SELECT SUM(`views`) / COUNT(*) AS `avg` FROM `gallery` GROUP BY `author`
) as `t`
Добавлено через 3 минуты
Сообщение от phpk
и объясните пожалуйста, почему с приставкой ) as `t` такая конструкция работает, а без неё нет?
Потому, что такой синтаксис майскуэл
SELECT ... FROM (subquery) [AS] name ...

Выборка должа идти из таблицы. Если это выборка из выборки, то под-выборку надо поместить во временную таблицу, задав ей алиас
Вопрос: агрегатное || по одной колонки?

посдкажите есть ли способ проще реализовать, функция || должна быть агрегатно вычеслена по одной колонке

-- в базе хранятся версии кучи значений, необходимо по одному id соединить все значения j последовательно
with repository_jsonb as (select 1::bigint as version, true as s, '{"id": "21843927", "id_pac": null, "org_id": "139"}'::jsonb as j
union all select 2, true, '{"id": "21843927", "org_id": "140"}'
union all select 3, true, '{"id": "21843927", "org_id": "141"}'
union all select 1, true, '{"id": "21843920", "id_pac": null, "org_id": "139"}'
union all select 4, true, '{"id": "21843927", "id_pac": "123"}'
union all select 5, true, '{"id": "21843927", "org2_id": "100"}'
),
repository_jsonb

r as (
with recursive t as (
	select j->>'id' as id, j, s, version from repository_jsonb where s and version=1
	union 
	select t.j->>'id', t.j||j.j, j.s, j.version from t inner join repository_jsonb j on id = j.j->>'id' and t.version+1=j.version where j.s
	)
select t.* from t inner join (select id, max(version) as version from t group by id) t2 using(id, version)
	)
-- рабочий вариант:
select * from r

--неудавшая попытка так как учитывается состояние только до изменения
--select *, (lead(j,-1,'{}'::jsonb) over(order by j->>'id' , version))||j, (lead(j,-1,'{}'::jsonb) over(order by j->>'id' , version)), j from 


не хватает функции? которая аналогично SUM(pole), сработала для ||(j), где каждое новое значение соединяется с предыдущим результатом, и еще бы в оконках если бы работало вообще супер было.

может уже все это придумано, я просто не смог найти?


правильный результат:
"21843920";"{"id": "21843920", "id_pac": null, "org_id": "139"}";t;1
"21843927";"{"id": "21843927", "id_pac": "123", "org_id": "141", "org2_id": "100"}";t;5
Ответ: Maxim Boguk,
попробовал агрегатные функции, в теории должны были сработать, на практике не смог добиться нужного результата

вот еще придумал один способ как можно сделать без рекурсии (если только она не используется в стандартной функции которую использовал)

with repository_jsonb as (select 1::bigint as version, true as s, '{"id": "21843927", "id_pac": null, "org_id": "139"}'::jsonb as j
	union all select 2, true, '{"id": "21843927", "org_id": "140"}'
	union all select 3, true, '{"id": "21843927", "org_id": "141"}'
	union all select 1, true, '{"id": "21843920", "id_pac": null, "org_id": "139"}'
	union all select 4, true, '{"id": "21843927", "id_pac": "123"}'
	union all select 5, true, '{"id": "21843927", "org2_id": "100"}'
	)
	select id, version, key, value from (
	SELECT (j->>'id')::bigint as id, version, max(version) over(partition by j->>'id', t.key) as max_version , t.key, t.value FROM repository_jsonb, LATERAL jsonb_each_text(J) T 
	)t where version = max_version
	

результат в виде таблицы который даже больше подходит для дальнейшего использования
idversionkeyvalues
218439201"id""21843920"
218439201"id_pac"""
218439201"org_id""139"
218439275"id""21843927"
218439274"id_pac""123"
218439273"org_id""141"
218439275"org2_id""100"