результаты группы в sql - PullRequest
       49

результаты группы в sql

0 голосов
/ 25 января 2020

В моей таблице настроек есть поле, содержимое которого:

  - Law 1  
  - Law 2  
  - Chemistry 1 
  - Chemistry 2 
  - History 1 
  - History 2
  - Modern language 1
  - Modern language 2
  - Modern language 3

(оценки)

Интересно, есть ли простой способ построить запрос SELECT sql, который возвращает:

  • Закон
  • Химия
  • История
  • Современный язык

Цель состоит в том, чтобы отфильтровать портал это показывает всех учителей, чтобы показать только учителей предмета с разделителями.

Заранее спасибо.

Ответы [ 6 ]

1 голос
/ 27 января 2020

Filemaker поддерживает только ограниченное подмножество SQL. Следующее может работать для вас (при условии, что ваши цифры никогда не превышают go выше 9):

SELECT DISTINCT LEFT(YourField, LENGTH(YourField) - 2) 
FROM YourTable

Цель состоит в том, чтобы отфильтровать портал, показывающий всех учителей, чтобы показать только учителей с разделителями. subject.

Не уверен, как запрос SQL поможет в этом. Правильное решение (как уже предлагалось в комментариях) состоит в том, чтобы иметь два отдельных поля, одно для предмета и одно для порядкового номера. Тогда задача становится тривиальной.

0 голосов
/ 25 января 2020

Что-то, что извлечет все до последнего появления символа пробела - это то, что, я думаю, вам нужно Попробуйте ...

SQL Сервер

select distinct left(col, len(col) - charindex(' ', reverse(col))) as subject
from your_table;

MySQL

select distinct left(col, length(col) - locate(' ', reverse(col))) as subject
from your_table;
0 голосов
/ 25 января 2020

Просто замените нежелательные подстроки chars и выберите distinct, как я вижу, вы хотите, чтобы некоторые агрегаты в вашем запросе группировались.

Если вы также хотите группировать и агрегировать, используйте столбец ниже output, а также группируйте и удаляйте distinct

  Select distinct REPLACE(column, 
     SUBSTR(COLUMN, 
     INSTR(COLUMN, ' '), 
       LENGTH(COLUMN)) 
      , "" ) as output FROM TABLE;
0 голосов
/ 25 января 2020

Решение для этого требования зависит от базы данных, которую вы используете. Это для MySql:

SELECT DISTINCT 
  TRIM(TRIM(TRAILING SUBSTRING_INDEX(col, ' ', -1) FROM col)) grouped_col
FROM tablename 

Этот запрос удаляет все после последнего пробела значения столбца col (изменить его на фактическое имя столбца) и, наконец, возвращает все отдельные значения столбца. Смотрите демо . Результаты:

| grouped_col     |
| --------------- |
| Law             |
| Chemistry       |
| History         |
| Modern language |
0 голосов
/ 25 января 2020

Если вы используете MS Sql, вы можете использовать подстроку и charindex для динамического вычисления данных. Если вы хотите получить значение перед пробелом, допустим для «ЗАКОН 1», если вы хотите получить ЗАКОН, указав промежуток между ними, это будет полезно.

with cte as (select 'Law 1'       as Cola union all 
select 'Law 2'       as Cola union all 
select 'Law 3'       as Cola union all   
select 'Chemistry 1' as Cola union all 
select 'Chemistry 2' as Cola union all 
select 'History 1'   as Cola union all 
select 'History 2'   as Cola )

select    substring(cola, 1  ,  CHARINDEX(' ',cola)-1) Calculated_value   from cte
group by  substring(cola, 1  ,  CHARINDEX(' ',cola)-1);

Выход:

Calculated_value
Chemistry
History
Law
0 голосов
/ 25 января 2020

Неясно точно что вы просите. Если вы хотите удалить последние два символа и получить различное значение, вы можете сделать что-то вроде этого:

select distinct left(col, len(col) - 2)
from t;

Все базы данных поддерживают функции left() и len(); однако имя может быть другим в используемой вами базе данных.

...