SQL - Создать столбец с отличным количеством другого столбца

Я пытаюсь добавить 3 колонки в таблицу SQl.

Column1: Total_Hours_Overall

Я хочу, чтобы этот столбец суммировал общее количество часов на последовательность_ID

Столбец 2: Всего_No_Codes

Я хочу, чтобы этот столбец был подсчетом отдельных значений в столбце «Клиент».

Столбец 3: Всего клиентов

Я хочу, чтобы этот столбец был подсчетом отдельных значений в столбце «Клиент», где столбец «Job_Type» равен «Клиент»,

Ниже приведен фрагмент таблицы, которую я сейчас имею. Есть более 8 Sequence_ID | Date_European | Часы | Месяц | День | Год | Day_of_Week | Client_Number | Клиент | Job_No | Job_Type 1001 | 01 / 09 / 2017 | 7.3 | 9 | 1 | 2017 | Пятница | 0 | ЕЖЕГОДНЫЙ ОСТАВЬТЕ | 0 | ЕЖЕГОДНЫЙ ОТПУСК 1001 | 04 / 09 / 2017 | 7.3 | 9 | 4 | 2017 | Понедельник | 0 | ЕЖЕГОДНЫЙ ОСТАВЬТЕ | 0 | ЕЖЕГОДНЫЙ ОТПУСК 1001 | 09 / 08 / 2017 | 2 | 8 | 9 | 2017 | Среда | 1 | Админ | A1 | Non-Billable 1001 | 24 / 08 / 2017 | 1.3 | 8 | 24 | 2017 | Четверг | 2 | Клиент1 | A2 | Клиент 1001 | 28 / 08 / 2017 | 2.3 | 8 | 28 | 2017 | Понедельник | 2 | Клиент1 | A2 | Клиент 1001 | 16 / 08 / 2017 | 0,5 | 8 | 16 | 2017 | Среда | 3 | Клиент2 | A3 | Клиент 1001 | 16 / 08 / 2017 | 1 | 8 | 16 | 2017 | Среда | 2 | Клиент1 | A2 | Клиент 1001 | 18 / 08 / 2017 | 3 | 8 | 18 | 2017 | Пятница | 3 | Клиент2 | A3 | Клиент 1001 | 22 / 08 / 2017 | 0,7 | 8 | 22 | 2017 | Вторник | 4 | Клиент3 | A4 | Клиент 1001 | 16 / 08 / 2017 | 7.3 | 8 | 16 | 2017 | Среда | 5 | Клиент4 | A5 | Клиент 1001 | 18 / 08 / 2017 | 1.3 | 8 | 18 | 2017 | Пятница | 5 | Клиент4 | A5 | Клиент 1001 | 21 / 08 / 2017 | 1 | 8 | 21 | 2017 | Понедельник | 5 | Клиент4 | A5 | Клиент 1001 | 12 / 09 / 2017 | 0,6 | 9 | 12 | 2017 | Вторник | 5 | Клиент4 | A5 | Клиент 1002 | 01 / 09 / 2017 | 7.3 | 9 | 1 | 2017 | Пятница | 0 | ЕЖЕГОДНЫЙ ОСТАВЬТЕ | 0 | ЕЖЕГОДНЫЙ ОТПУСК 1002 | 04 / 09 / 2017 | 7.3 | 9 | 4 | 2017 | Понедельник | 0 | ЕЖЕГОДНЫЙ ОСТАВЬТЕ | 0 | ЕЖЕГОДНЫЙ ОТПУСК 1002 | 09 / 08 / 2017 | 2 | 8 | 9 | 2017 | Среда | 1 | Админ | A1 | Non-Billable 1002 | 24 / 08 / 2017 | 1.3 | 8 | 24 | 2017 | Четверг | 4 | Клиент3 | A4 | Клиент 1002 | 28 / 08 / 2017 | 2.3 | 8 | 28 | 2017 | Понедельник | 5 | Клиент4 | A5 | Клиент 0 уникальный sequence_ID, который имеет несколько строк на ID. Я хочу, чтобы приведенные выше столбцы отображали значения для каждой строки.

Sequence_ID |Date_European  |Hours  |Month  |Day    |Year   |Day_of_Week    |Client_Number  |Client         |Job_No |Job_Type       |Total_Hours_Overall    |Total_No_Codes |Total Clients
1001        |01/09/2017     |7.3    |9      |1      |2017   |Friday         |0              |ANNUAL LEAVE   |0      |ANNUAL LEAVE   |35.6                   |6              |4
1001        |04/09/2017     |7.3    |9      |4      |2017   |Monday         |0              |ANNUAL LEAVE   |0      |ANNUAL LEAVE   |35.6                   |6              |4
1001        |09/08/2017     |2      |8      |9      |2017   |Wednesday      |1              |Admin          |A1     |Non-Billable   |35.6                   |6              |4
1001        |24/08/2017     |1.3    |8      |24     |2017   |Thursday       |2              |Client1        |A2     |Client         |35.6                   |6              |4
1001        |28/08/2017     |2.3    |8      |28     |2017   |Monday         |2              |Client1        |A2     |Client         |35.6                   |6              |4
1001        |16/08/2017     |0.5    |8      |16     |2017   |Wednesday      |3              |Client2        |A3     |Client         |35.6                   |6              |4
1001        |16/08/2017     |1      |8      |16     |2017   |Wednesday      |2              |Client1        |A2     |Client         |35.6                   |6              |4
1001        |18/08/2017     |3      |8      |18     |2017   |Friday         |3              |Client2        |A3     |Client         |35.6                   |6              |4
1001        |22/08/2017     |0.7    |8      |22     |2017   |Tuesday        |4              |Client3        |A4     |Client         |35.6                   |6              |4
1001        |16/08/2017     |7.3    |8      |16     |2017   |Wednesday      |5              |Client4        |A5     |Client         |35.6                   |6              |4
1001        |18/08/2017     |1.3    |8      |18     |2017   |Friday         |5              |Client4        |A5     |Client         |35.6                   |6              |4
1001        |21/08/2017     |1      |8      |21     |2017   |Monday         |5              |Client4        |A5     |Client         |35.6                   |6              |4
1001        |12/09/2017     |0.6    |9      |12     |2017   |Tuesday        |5              |Client4        |A5     |Client         |35.6                   |6              |4
1002        |01/09/2017     |7.3    |9      |1      |2017   |Friday         |0              |ANNUAL LEAVE   |0      |ANNUAL LEAVE   |20.2                   |2              |2
1002        |04/09/2017     |7.3    |9      |4      |2017   |Monday         |0              |ANNUAL LEAVE   |0      |ANNUAL LEAVE   |20.2                   |2              |2
1002        |09/08/2017     |2      |8      |9      |2017   |Wednesday      |1              |Admin          |A1     |Non-Billable   |20.2                   |2              |2
1002        |24/08/2017     |1.3    |8      |24     |2017   |Thursday       |4              |Client3        |A4     |Client         |20.2                   |2              |2
1002        |28/08/2017     |2.3    |8      |28     |2017   |Monday         |5              |Client4        |A5     |Client         |20.2                   |2              |2

Ниже приведен пример того, как я хочу, чтобы мой стол выглядел.

select t.*, sum(hours) over (partition by sequence_id) as sum_hours,
       max(codes_seqnum) over (partition by sequence_id) as num_codes,
       max(clients_seqnum) over (partition by sequence_id) as num_clients
from (select t.*,
             dense_rank() over (partition by sequence_id order by client) as codes_seqnum,
             dense_rank() over (partition by sequence_id, job_type order by (case when job_type = 'Client' then client end)) as client_seqnum
      from t
     ) t;

Я попытался (и не смог) сделать это по-разному. Я думаю, что использование подзапросов требуется, но я не могу получить правильный формат.

Еще одна проблема, с которой я нахожусь трудно, чтобы получить требуемый формат, является функцией подсчета, поскольку я знаю, что для этого требуется предложение group by, но я хочу сохранить все строки в моей таблице.

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

sql,sql-server,count,subquery,distinct,

1

Ответов: 1


1 принят

Вы можете использовать функции окна:

COUNT(DISTINCT)

0на самом деле сложна с функциями окна в SQL Server. Вышеупомянутое в основном работает, но оно не будет возвращено, 0если клиентов нет. Возможно, было бы лучше только JOINв результатах:

select t.*, tt.sum_hours, tt.num_codes, tt.num_clients
from t join
     (select sequence_id, sum(hours) as sum_hours,
             count(distinct client) as num_codes,
             count(distinct case when job_type = 'Client' then client end) as num_clients
      from t
      group by sequence_id
     ) tt
     on tt.sequence_id = t.sequence_id;
SQL, SQL-сервер, граф, вложенный запрос, различны,
Похожие вопросы