Таблица Bill (Master) и BillDetail (Detail): создание запроса с объединением таблиц

Я новичок в SQL-сервере и хочу сгенерировать запрос из двух таблиц - Bill (основная таблица) и BillDetail (детальная таблица). Эти две табличные данные приведены ниже:

Данные таблицы счетов:

+------------------+--------------+---------------+------------+----------+-------------------------+
| ContractorBillId | ContractorId |    BillNo     |  BillDate  |IsDeleted |       UpdatedDate       |
+------------------+--------------+---------------+------------+----------+-------------------------+
|             1050 |            2 | 2-20190329-W  | 2019-03-29 |        0 | 2019-03-29 13:53:51.447 |
|             1051 |            2 | 2-20190329-W1 | 2019-03-29 |        0 | 2019-03-29 18:48:48.077 |
|             1052 |            2 | 2-20190402-W  | 2019-04-02 |        0 | 2019-04-02 15:54:16.267 |
|             1053 |            1 | 1-20190402-E  | 2019-04-02 |        0 | 2019-04-02 18:58:50.753 |
|             1078 |            1 | 1-20190403-A  | 2019-04-03 |        0 | 2019-04-03 10:59:18.083 |
|             1079 |            1 | 1-20190403-A1 | 2019-04-03 |        0 | 2019-04-03 11:00:37.197 |
|             1080 |            1 | 1-20190403-E  | 2019-04-03 |        0 | 2019-04-03 11:33:41.333 |
+------------------+--------------+---------------+------------+----------+-------------------------+

Данные таблицы BillDetail:

+----------------------+------------------+---------------------+------------+--------+-------------+
| ContractorBillItemId | ContractorBillId | ContractorPayTypeId | WeekEnding | Hours  | GrossAmount |
+----------------------+------------------+---------------------+------------+--------+-------------+
|                 1064 |             1050 |                   2 | 2019-03-29 | 145.00 | 725000.0000 |
|                 1065 |             1051 |                   1 | 2019-03-29 |  50.00 |  75000.0000 |
|                 1066 |             1052 |                   1 | 2019-04-05 |  10.00 |  15000.0000 |
|                 1067 |             1052 |                   2 | 2019-04-05 |  12.00 |  60000.0000 |
|                 1068 |             1053 |                   4 | 2019-04-02 |   1.00 |    100.0000 |
|                 1069 |             1053 |                   3 | 2019-04-03 |   1.00 |    100.0000 |
|                 1070 |             1053 |                   2 | 2019-04-04 |   1.00 |    100.0000 |
|                 1071 |             1053 |                   4 | 2019-04-05 |   1.00 |    100.0000 |
|                 1072 |             1053 |                   4 | 2019-04-06 |   1.00 |    100.0000 |
|                 1089 |             1078 |                1006 | 2019-04-05 |   1.00 |    100.0000 |
|                 1090 |             1079 |                1006 | 2019-04-05 |  12.00 |   1200.0000 |
|                 1091 |             1080 |                   4 | 2019-04-02 |   1.00 |    100.0000 |
|                 1092 |             1080 |                   4 | 2019-04-03 |   1.00 |    100.0000 |
|                 1093 |             1080 |                   4 | 2019-04-04 |   1.00 |    100.0000 |
|                 1094 |             1080 |                   4 | 2019-04-05 |   1.00 |    100.0000 |
|                 1095 |             1080 |                   4 | 2019-04-06 |   1.00 |    100.0000 |
+----------------------+------------------+---------------------+------------+--------+-------------+

Из этих двух таблиц я хочу получить результат, как показано ниже.

+------------------+--------------+---------------+------------+----------+-------------------------+--------------------+------------+--------+
| ContractorBillId | ContractorId |    BillNo     |  BillDate  |IsDeleted |       UpdatedDate       | ContractorPayTypeId| WeekEnding | Hours  |
+------------------+--------------+---------------+------------+----------+-------------------------+--------------------+------------+--------+
|             1050 |            2 | 2-20190329-W  | 2019-03-29 |        0 | 2019-03-29 13:53:51.447 |                  2 | 2019-03-29 | 145.00 |
|             1051 |            2 | 2-20190329-W1 | 2019-03-29 |        0 | 2019-03-29 18:48:48.077 |                  1 | 2019-03-29 |  50.00 |
|             1052 |            2 | 2-20190402-W  | 2019-04-02 |        0 | 2019-04-02 15:54:16.267 |                  1 | 2019-04-05 |  22.00 |
|             1053 |            1 | 1-20190402-E  | 2019-04-02 |        0 | 2019-04-02 18:58:50.753 |                  4 | 2019-04-02 |   5.00 |
|             1078 |            1 | 1-20190403-A  | 2019-04-03 |        0 | 2019-04-03 10:59:18.083 |               1006 | 2019-04-05 |   1.00 |
|             1079 |            1 | 1-20190403-A1 | 2019-04-03 |        0 | 2019-04-03 11:00:37.197 |               1006 | 2019-04-05 |  12.00 |
|             1080 |            1 | 1-20190403-E  | 2019-04-03 |        0 | 2019-04-03 11:33:41.333 |                  4 | 2019-04-02 |   5.00 |
+------------------+--------------+---------------+------------+----------+-------------------------+--------------------+------------+--------+

Пожалуйста, помогите мне с созданием запроса для него. В результате Hours и GrossAmount из таблицы деталей должны быть суммой, а ContractorPayTypeId и WeekEnding должны быть первыми элементами.

Я использую SQL-сервер

iDipa 10.04.2019 10:35

Что именно вы подразумеваете под «ContractorPayTypeId и WeekEnding должны быть в первую очередь пунктом». ?

Johwhite 10.04.2019 10:40

Для одного счета есть 5 элементов, затем для результата ConctractorPayTypeId и WeekEnding выберите его из первого элемента.

iDipa 10.04.2019 10:44
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
154
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать расширенные запросы SQL, такие как SUM() OVER PARTITION BY, FIRST_VALUE() ETC.

 SELECT BillTable.* ,
   CS.SumGrossAmount ,
   CS.SumHours ,
   CS.FirstWeekEnding ,
   CS.FirstContractorPayTypeId
   FROM   dbo.BillTable
   CROSS APPLY 
     (   SELECT  TOP 1 S.SumGrossAmount ,
                        S.SumHours ,
                        S.FirstWeekEnding ,
                        S.FirstContractorPayTypeId
                FROM     (   SELECT * ,
                                    SUM(GrossAmount) OVER ( PARTITION BY ContractorBillId
                                                            ORDER BY ContractorBillItemId
                                                            ) AS SumGrossAmount ,
                                    SUM(Hours) OVER ( PARTITION BY ContractorBillId
                                                        ORDER BY ContractorBillItemId
                                                    ) AS [SumHours] ,
                                    FIRST_VALUE(WeekEnding) OVER ( PARTITION BY ContractorBillId
                                                                    ORDER BY ContractorBillItemId
                                                                ) AS [FirstWeekEnding] ,
                                    FIRST_VALUE(ContractorPayTypeId) OVER ( PARTITION BY ContractorBillId
                                                                            ORDER BY ContractorBillItemId
                                                                            ) AS [FirstContractorPayTypeId]
                            FROM   dbo.BillDetail
                        ) S
                WHERE    S.ContractorBillId = dbo.BillTable.ContractorBillId
                ORDER BY S.ContractorBillItemId DESC
               ) CS;

Другие вопросы по теме