Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

Открыть новую тему     Написать ответ в эту тему

NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет!
 
Давно не брал SQL в руки, но все циклично.
Есть вот такая табличка:
  NAME COLOR    
  Ivanov RED    
  Ivanov RED    
  Ivanov GREEN    
  Ivanov RED    
  Ivanov GREEN    
  Ivanov YELLOW    
  Petrov YELLOW    
  Petrov YELLOW    
  Petrov PURPLE    
  Petrov RED    
  Petrov YELLOW    
  Petrov RED    
  Petrov GREEN    
  Sidorov GREEN    
  Sidorov GREEN    
  Sidorov YELLOW    
  Sidorov PURPLE    
  Sidorov PURPLE    
  Sidorov RED    
  Sidorov RED  

 
Нужен запрос, чтобы получить вот такой результат (сумма цветов для каждой фамилии):
  NAME/COLOR RED YELLOW GREEN PURPLE    
  Ivanov 3 1 2 0    
  Petrov 2 3 1 1    
  Sidorov 2 1 2 2  

 
Крутил, вертел, но пока не вспомнил как из первой таблички собрать вторую.
 
Код для создания таблицы с данными

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 13:30 10-11-2022 | Исправлено: NiXXX, 13:56 10-11-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
http://www.sqlfiddle.com/#!9/0fe102/4/0

Код:
select
u_name as NAME,
sum(case when u_color = 'RED' then 1 else 0 end) as RED,
sum(case when u_color = 'YELLOW' then 1 else 0 end) as YELLOW,
sum(case when u_color = 'GREEN' then 1 else 0 end) as GREEN,
sum(case when u_color = 'PERFECT' then 1 else 0 end) as PERFECT
from test_tbl
group by u_name

Всего записей: 15114 | Зарегистр. 20-09-2014 | Отправлено: 00:39 13-11-2022
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, спасибо!
 
А если предположить, что помимо Иванова, Петрова и Сидорова есть и другие фамилии, то можно их как-то объединить, например под "Остальные" и суммарно посчитать цвета и для них?
Конструкция "case when u_name in ('Ivanov', 'Petrov', 'Sidorov') then u_name else 'Other' end ) as NAME" явно не прокатит, так как все фамилии не из списка будут заменены на Other, но группировки и суммирования не произойдет.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 09:03 15-11-2022 | Исправлено: NiXXX, 15:34 15-11-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX

Цитата:
то можно их как-то объединить, например под "Остальные" и суммарно посчитать цвета и для них?

делайте UNION с запросом для остальных.
http://www.sqlfiddle.com/#!9/649ad2/2

Всего записей: 15114 | Зарегистр. 20-09-2014 | Отправлено: 02:27 16-11-2022
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, спасибо!
Сделал иначе - через "case when u_name in ('Ivanov', 'Petrov', 'Sidorov') then u_name else 'Other' end ) as NAME" и group by 1 (а не по названию поля u_name).

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 12:19 16-11-2022
pavki



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет, может кто сталкивался есть поле где хранится дата в формате unixtimestamp  
типа 1672466400000 все переводится нормальный вид так:
 
dateadd(ss, cast(DATE_TO as bigint) % 1000, dateadd(ss, cast(DATE_TO as bigint) / 1000, '19700101'))
 
всё прекрасно работаем на датах типа 1672466400000 но тут какай-то чувак вбил 2099 год ---> 4070930400000 и dateadd ругается на Arithmetic overflow хотя макс размер bigint  9223372036854775807 дата должна 4070930400000 вмещаться

Всего записей: 109 | Зарегистр. 01-11-2009 | Отправлено: 08:34 20-11-2022 | Исправлено: pavki, 08:42 20-11-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pavki

Цитата:
хотя макс размер bigint

размер поля тут ни при чем. это функция ругается.
https://stackoverflow.com/questions/15030474/sql-using-dateadd-with-bigints
есть https://learn.microsoft.com/en-us/sql/t-sql/functions/datediff-big-transact-sql?view=sql-server-ver16

Всего записей: 15114 | Зарегистр. 20-09-2014 | Отправлено: 08:36 20-11-2022 | Исправлено: Mavrikii, 08:44 20-11-2022
pavki



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
cпс) если что сделал так: dateadd(ss, cast(DATE_TO as bigint) % 1000, dateadd(dd, cast(DATE_TO as bigint) / 1000/60/60/24, '19700101')) норм робит

Всего записей: 109 | Зарегистр. 01-11-2009 | Отправлено: 17:38 23-11-2022 | Исправлено: pavki, 17:40 23-11-2022
lsd11



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Приветствую, камрады!
MSSQL
Есть таблица вида:
datetime | имя рабочей станции | юзер | принтер | счётчик страниц | ip
(таймстемп события)
Задача:
Посчитать, сколько каждый юзер напечатал страниц за каждый день
Пробовал сначала через cast отобразить только дату из таймстемпа в новом столбце, но по-видимому, не получилось, т.к. SUM за дату не суммирует, а выводит всё, что было за дату юзеру отдельными строками.
Я так понимаю, что единственным Select'ом тут не обойтись?
Помогите, пожалуйста, весь мозг сломал.  

Всего записей: 146 | Зарегистр. 29-08-2007 | Отправлено: 10:15 28-11-2022
vikkiv



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lsd11
 
преобразуйте timestamp в дату (есть такой тип данных) + юзер и по ним произвести группировку (group by) под аггрегацию SUM()
можно дату в int (типа 20221128) или в текст ("2022-11-28"), это уже на свой вкус как данные выводить нужно.

Всего записей: 747 | Зарегистр. 10-11-2005 | Отправлено: 14:38 28-11-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lsd11

Цитата:
Пробовал сначала через cast отобразить только дату из таймстемпа в новом столбце, но по-видимому, не получилось, т.к. SUM за дату не суммирует, а выводит всё, что было за дату юзеру отдельными строками.

делайте группировку по GROUP BY CAST(datetime AS DATE)

Всего записей: 15114 | Зарегистр. 20-09-2014 | Отправлено: 22:37 28-11-2022
kenko2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сорри если не по теме - просто не знаю где задать этот вопрос.
 
Подскажите, как в БД SQLite (*.db) (в ней слова, состоящие из любых знаков, не только буквы, но и цифры и даже некоторые символы типа &,$,@,!) в поле "быстрый фильтр" или в окошке "фильтр" отфильтровать данные, состоящие, например, ровно из 5 знаков? Ни больше, ни меньше, а именно 5 знаков в слове. Другими словами, есть ли в БД SQLite "wild card" для одного знака?  
 
В менеджере БД SQLite, который я пользую, DB Browser for SQLite как я понял, можно использовать % для любого числа знаков, а если мне нужно отобрать слова, состоящие из строго определенного количества знаков? В доках к проге я этого не нашел, а на Гитхабе мой вопрос просто удалили, да и тема там полумертвая.

Всего записей: 3807 | Зарегистр. 10-11-2005 | Отправлено: 23:03 10-12-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kenko2
по длине
SELECT *
FROM table
WHERE LENGTH(field)=5;

Всего записей: 15114 | Зарегистр. 20-09-2014 | Отправлено: 23:15 10-12-2022
kenko2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
по длине
SELECT *
FROM table
WHERE LENGTH(field)=5;

Спасибо, а в этом моем "обозревателе SQLite" (DB Browser for SQLite) это можно реализовать? Я не програмер, сам не соображу. Или нужна другая прога?

Всего записей: 3807 | Зарегистр. 10-11-2005 | Отправлено: 02:48 11-12-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kenko2
что вы хотитие сделать, для чего? делаете запрос, он показывает результат. закладка Execute SQL.
остальное - особенности программы, спрашивается в разделе Программы - умеет ли она это или нет.
это сугубо специфика программы, а не SQL языка.

Всего записей: 15114 | Зарегистр. 20-09-2014 | Отправлено: 02:53 11-12-2022 | Исправлено: Mavrikii, 03:01 11-12-2022
kenko2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
делаете запрос, он показывает результат. закладка Execute SQL.
остальное - особенности программы, спрашивается в разделе Программы - умеет ли она это или нет.

Понял,

Всего записей: 3807 | Зарегистр. 10-11-2005 | Отправлено: 03:05 11-12-2022 | Исправлено: kenko2, 03:46 11-12-2022
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем доброго времени суток!
 
Продолжаю быть начинающим в PostgreSQL. Случилась крайне странная ситуация - не срабатывает команда update.
Для теста создал схему, в ней две таблицы - tbl и tbl_h, на обновление tbl повесил триггер - он перекидывает предыдущие значения в таблицу tbl_h (историческая). Запускаю update и commit (на всякий случай) - update "проходит", но в основной таблице ничего не меняется, а триггер срабатывает и добавляет строку в таблицу с историей.
Пытаюсь разобраться в чем проблема. Подскажите новичку куда копать.
Код создания схемы
 
P.S. Все тесты гоняю в DBeaver 22.2.4.
 
P.P.S. Вопрос снимается - решение найдено! В функции надо возвращать значение NEW, а не NULL.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 15:44 01-02-2023 | Исправлено: NiXXX, 10:08 02-02-2023
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В экселе есть встроенная функция norm.dist(x,mean,standart_deviation,cumulative).  
А есть ли ее аналог в postgres?

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 16:04 08-02-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
https://www.cybertec-postgresql.com/en/generating-a-normal-distribution-in-sql/

Всего записей: 15114 | Зарегистр. 20-09-2014 | Отправлено: 17:15 08-02-2023
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, эту статью видел.  
Функция normal_rand на вход принимает только int, а мне нужно, чтобы принималось любое, как в экселе или тех же гуглошитах.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 12:40 09-02-2023
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru