Sql выбрать несколько значений из столбца: select – Выборка записей, одновременно имеющих несколько значений

SQL – несколько условий для одного столбца, вывод в разные столбцы


Вопрос задан


Изменён
19 дней назад


Просмотрен
1k раз

Есть два запроса, которые нужно объединить в один
SELECT otdel, COUNT(id_task )as c1 FROM `task` WHERE status_task=0 GROUP BY otdel ORDER BY otdel
и
SELECT otdel, COUNT(id_task )as c2 FROM `task` WHERE status_task=2 GROUP BY otdel ORDER BY otdel

В результате должна получиться таблица:

otdel c1 c2
1 5 Null
2 2 3
3 Null 3

Вместо Null можно 0.
Заранее спасибо.

Вот такое решение получилось, всем спасибо!

SELECT otdel,
    COUNT(CASE
            WHEN status_task = 0
                THEN status_task
            ELSE NULL
            END) as status0,
    COUNT(CASE
            WHEN status_task = 2 
                THEN status_task
            ELSE NULL
            END) as status2
FROM `task`
GROUP BY otdel
ORDER By otdel






1

Стандартный прием «Разворот CASE’ом»

SELECT
  otdel,
  SUM(CASE WHEN status_task=0 THEN 1 END) AS c1,
  SUM(CASE WHEN status_task=2 THEN 1 END) AS c2
FROM `task`
GROUP BY otdel
ORDER BY otdel

В некоторых СУБД для этого есть отдельная команда PIVOT






2







Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации


Почта

Необходима, но никому не показывается





Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки


sql – Как в один столбец записать несколько значений?


Вопрос задан


Изменён
1 год 8 месяцев назад


Просмотрен
1k раз

Есть таблица, например User, у которой несколько столбцов

CREATE TABLE USER
(
  PR_KEY            VARCHAR2(255 CHAR) NOT NULL
    PRIMARY KEY,
  name VARCHAR2(100 CHAR),
  surname VARCHAR2(100 CHAR)
)

Требуется создать эту таблицу на SQL с еще одним столбцом, но, в этом столбце должны быть размещены несколько значений, например, список строк – номеров комнат, в который пользователь имеет доступ

Как это сделать через еще одну таблицу и как значения из другой таблицы будут подставляться в основную?






3

Для решения данной задачи Вам необходимо создать таблицу комнаты

С колонками id, name, num_room . .. (Остальные свойства характеризующие комнаты). Далее нужно понимать вашу задачу
1. Если к пользователю прикреплены несколько комнат и 1 комната может принадлежать только одному пользователю, то Вам необходимо создать в новой таблице поле user_id (типа integer, unsigned( не может быть меньше 0) и повесить index на данное поле) и далее прочитать о внешних ключах foreign key(домашнее задание Вам) и про inner join как в запросе объединить таблицы и получить обеденные данные
2. Если у вас за пользователем может быть закреплено несколько комнат, и к одной комнате могут быть прикреплены несколько пользователей, то здесь связь многие ко многим, то здесь необходимо создать 3 таблицу user_room с полями id user_id room_id и то же самое домашнее задание только как создать foreign key со связью многие ко многим

Отвечая на последней вопрос, соединяете таблицы по одному из двух путей далее вы заполняете таблицу rooms комната 1, комната 2, комната 3 . ..
И используя select * from ... получаете данные уже с комнатами которые присоединены к пользователям!

P.s. обошёлся бы без домашних заданий, но я с телефона. Надеюсь помог)







Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации


Почта

Необходима, но никому не показывается





Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки


mysql – SQL-запрос для сопоставления нескольких значений в одном столбце

спросил

Изменено
3 года, 7 месяцев назад

Просмотрено
133 тыс. раз

У меня есть следующая таблица в MySQL.

 Идентификационный номер Должность Годы Сотрудник
1 Софт.Егр 2000-2005 А
2 Soft.Egr 2000-2005 B
3 Soft.Egr 2000-2005 C
4 Sr.Soft.Egr 2005-2010 A
5 Sr.Soft.Egr 2005-2010 B
6 Pro.Mgr 2010-2012 A
 

Мне нужно получить Сотрудников, которые работали как Soft.Egr и Sr.Soft.Egr и Pro.Mgr. В запросе нельзя использовать IN или несколько AND. Как это сделать??

1

В одну сторону:

 выбрать Сотрудник
из job_history
где Обозначение в ('Soft.Egr','Sr.Soft.Egr','Pro.Mgr')
группировать по сотруднику
имея количество (различное обозначение) = 3
 

0

То, что вы на самом деле ищете, это реляционное деление, даже если ваши требования к упражнениям запрещают использование И (по какой причине?). Это сложно, но можно правильно выразить в SQL.

Реляционное деление в прозе означает: Найти тех служащих, у которых есть запись в таблице служащих для всех существующих обозначений. Или в SQL:

 SELECT DISTINCT E1.Employee FROM Employees E1
ГДЕ НЕ СУЩЕСТВУЕТ(
    ВЫБЕРИТЕ 1 ИЗ Сотрудники E2
    ГДЕ НЕ СУЩЕСТВУЕТ(
        ВЫБЕРИТЕ 1 ИЗ Сотрудники E3
        ГДЕ E3.Сотрудник = E1.Сотрудник
        И E3.Обозначение = E2.Обозначение
    )
)
 

Чтобы увидеть приведенный выше запрос в действии, рассмотрите этот SQLFiddle

Хороший ресурс, объясняющий реляционное разделение, можно найти здесь:
http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division

2

Если вам нужно получить дополнительную информацию о каждой из ролей (например, даты), то возможным решением является присоединение к исходной таблице для каждого из дополнительных обозначений:

 ВЫБЕРИТЕ t.Employee, t.Designation, t.Years, t1.Designation, t1.Years, t2.Designation, t2.Years
С Таблицы т
ВНУТРЕННЕЕ СОЕДИНЕНИЕ t2 ON (t2.Employee = t.Employee AND t2.Designation = 'Sr. Soft.Egr')
ВНУТРЕННЕЕ СОЕДИНЕНИЕ t3 ON (t3.Employee = t.Employee AND t3.Designation = 'Soft.Egr')
ГДЕ t.Designation = 'Pro.Mgr';
 

Почему не следующее (для postgresql)?

 ВЫБЕРИТЕ сотрудника ИЗ Сотрудники, ГДЕ Обозначение = 'Sr.Soft.Egr'
ПЕРЕСЕЧАТЬ
ВЫБЕРИТЕ сотрудника ИЗ Сотрудники, ГДЕ Обозначение = 'Soft.Egr'
ПЕРЕСЕЧАТЬ
ВЫБЕРИТЕ сотрудника ИЗ Сотрудники, ГДЕ Обозначение = 'Pro.Mgr'
 

Ссылка на SQLfiddle

Я знаю, что это может быть неоптимизировано, но мне гораздо проще понять и изменить это.

Попробуйте этот запрос:

 SELECT DISTINCT t1.employee,
                t1.обозначение
ОТ tempEmployees t1, tempEmployees t2, tempEmployees t3
ГДЕ t1.employee = t2.employee И
      t2.employee = t3.employee И
      t3.employee = t1.employee И
      t1.обозначение != t2.обозначение И
      t2.обозначение != t3.обозначение И
      t3.обозначение != t1.обозначение
 

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Оператор SQL с использованием предложения Where с несколькими значениями

У меня есть таблица с несколькими строками со следующими полями:

 PersonName SongName Status
 

Я хочу использовать имена, выбранные из списка с множественным выбором, значения которых я могу получить, а затем выполнить предложение where, чтобы оно показывало названия песен, которые все выбранные люди могут играть, поэтому статус завершен.

Например:

 PersonName SongName Статус
 Холли Хайленд завершена
 Холли Мех завершена
 Райан Хайленд завершен
 

Если я выберу Холли и Райана из списка и нажму кнопку, запрос должен просто показать Highland, поскольку это то, что они оба знают.

2

Попробуйте это:

 выберите songName из t
где имя человека в ("Райан", "Холли")
группа по названию песни
имея количество (отличное имя человека) = 2
 

Количество в наличии должно соответствовать количеству людей. Если вам также нужно, чтобы Статус был Complete , используйте это предложение where вместо предыдущего:

 где personName in ('Ryan', 'Holly') и status = 'Complete'
 

6

 SELECT PersonName, songName, статус
ИЗ таблицы
ГДЕ имя В («Холли», «Райан»)
 

Если вы используете параметризованную хранимую процедуру:

  1. Передать строку через запятую
  2. Используйте специальную функцию для разделения строки, разделенной запятыми, на переменную табличного значения
  3. Используйте INNER JOIN ON t.