SQL - группировка и подсчет символов в двух столбцах - PullRequest
1 голос
/ 07 февраля 2020

У меня есть эта таблица:

|---------------------|------------------|------------------|
|      NAME           |     GENDER       |     JOB          |
|---------------------|------------------|------------------|
|      John           |     Male         |    Accountant    |
|---------------------|------------------|------------------|
|      Jane           |     Female       |    Accountant    |
|---------------------|------------------|------------------|
|      Stephen        |     Male         |    Sales         |
|---------------------|------------------|------------------|
|      James          |     Male         |    Accountant    |
|---------------------|------------------|------------------|
|      Hanna          |     Female       |    Sales         |
|---------------------|------------------|------------------|
|      Joe            |     Male         |    Sales         |
|---------------------|------------------|------------------|
|      Diana          |     Female       |    Sales         |
|---------------------|------------------|------------------|

... и я хотел бы получить таблицу, подобную этой:

|---------------------|------------------|------------------|
|      JOB            |     MALE         |     FEMALE       |
|---------------------|------------------|------------------|
|      Accountant     |       2          |    1             |
|---------------------|------------------|------------------|
|      Sales          |       2          |    2             |
|---------------------|------------------|------------------|

Итак, я попытался с group by, но я ' ищу более короткий и простой запрос

Ответы [ 3 ]

0 голосов
/ 07 февраля 2020

Для этого можно использовать PIVOT:

Настройка

DECLARE @data as Table
(
    Name varchar(50) not null,
    Gender varchar(10) not null,
    Job varchar(10) not null
)
INSERT INTO @data (Name, Gender, Job)
VALUES ('John','Male','Accountant'),
('Jane','Female','Accountant'),
('Stephen','Male','Sales'),
('James','Male','Accountant'),
('Hanna','Female','Sales'),
('Joe','Male','Sales'),
('Diana','Female','Sales')

Запрос:

заменить @data ссылкой на таблицу

SELECT Job, Male = SUM(Male), Female = SUM(Female)
FROM @data
PIVOT
(
    SUM ( Gender ) FOR
    Gender IN ( Male, Female )
) as pvtData
GROUP BY Job
0 голосов
/ 07 февраля 2020

Вы не пометили свою базу данных, но если она MySQL, это будет «самая короткая». Сказав это, я рекомендую использовать явные операторы case, а не полагаться на синтаксические особенности для обработки условных выражений.

select job
      ,sum(gender = 'Male') num_males
      ,sum(gender = 'Female') num_females
from t
group by job;
0 голосов
/ 07 февраля 2020

Вы ищете условное агрегирование:

select job,
       sum(case when gender = 'Male' then 1 else 0 end) as num_males,
       sum(case when gender = 'Female' then 1 else 0 end) as num_females
from t
group by job;
...