Как объединить 2 таблицы, чтобы вы могли правильно суммировать поля в обеих таблицах

Я присоединяюсь к 2 таблицам и суммирую 3 поля, 2 из 1 таблицы и 1 из второй. Однако в таблицах есть несколько записей, и это дает мне неверные итоги (суммы). Я знаю, что не так, но не знаю, как написать SQL, чтобы получить правильный результат.

В основном итоги удваиваются из-за 2 записей для CCNum 001. Итак, очевидно, что SQL неверен, но каким будет правильный SQL?

Не знаю, как будет выглядеть SQL.

SELECT  AETCC.PayPeriodID, EI.ADP_ID, EI.LastName + ', ' 
 + EI.FirstName AS EmpName, AETCC.LocationNum 
 + '-' + AETCC.CostCenterNum AS CostString, 
 AETCC.LocationNum AS Location, AETCC.CostCenterNum AS CostCenter, 
 AllocationType, sum(AD.TotalHoursWorked) as TotalHoursWorked, 
 sum(AD.TotalPercentWorked) as TotalPercentWorked, 
 sum(AETCC.ExpenseAmount) AS ExpAmt
        FROM    dbo.AllocatedExpenseToCostCenter AS AETCC 
        INNER JOIN
            dbo.AllocationData AS AD 
                ON AETCC.ADP_ID = AD.ADP_ID 
                AND AETCC.CostCenterNum = AD.CostCenterNum 
                AND AETCC.LocationNum = AD.LocationNum 
                AND AETCC.PayPeriodID = AD.PayPeriodID 
        INNER JOIN
            dbo.EmployeeInformation AS EI 
                ON AETCC.ADP_ID = EI.ADP_ID
        WHERE        (AETCC.ExpenseAccount = '8000')
--      GROUP BY AETCC.PayPeriodID, EI.ADP_ID, EI.FirstName, EI.LastName,
--      AETCC.LocationNum, AETCC.CostCenterNum
        GROUP BY AETCC.PayPeriodID, AllocationType, AETCC.LocationNum,
        AETCC.CostCenterNum, EI.ADP_ID, EI.FirstName, EI.LastName

Данные в первой таблице:

PayPrd,LocNum,CCNum,ExpAcct,ExpenseAmount,ADP_ID,HoursWorked
1921,024,001,8000,175.2496,2063,0.63
1921,024,001,8000,1810.2617,2063,67.49
1921,024,013,8000,93.3417,2063,0.18

Данные во второй таблице:

PayPrd,LocNum,CCNum,Hours,%,ADP_ID
1921,024,001,7.50,0.0843,2063
1921,024,001,77.50,87.0787,2063
1921,024,013,4.00,0.0449,2063

Текущие результаты:

PayPrd,ADP_ID,EmpName,CostString,LocNum,CCNum,Hours,%,ExpAmt
1921,2063,King; Tom,024-001,024,001,170.00,174,3971.0226
1921,2063,King; Tom,024-013,024,013,4.00,0.4,93.3417

Спасибо за указатели. Я пытался вставить пример вывода. Перед публикацией он выглядел отформатированным, но после публикации оказался неформатированным и выглядел ужасно. Вот почему я изменил его на CSV. Все еще пытаюсь понять, как пользоваться форумом.

Darrell 13.06.2019 14:36

Хорошо, что вы даете текстовые CSV-файлы, но они не являются табличными или «вырезанными и вставленными и исполняемым кодом». Нажмите «Текст в DDL» на sqlfiddle.com. (Но% не является допустимым именем столбца.) PS Когда вы кодируете/отлаживаете, добавляйте к рабочему коду и заставляйте части работать отдельно, а затем объединяйте их. Чтобы описать результат: скажите достаточно, чтобы кто-то мог уйти и вернуться с решением. Предоставляя (базовый результат или результат запроса) отношение (корабль)/ассоциацию или таблицу, скажите, что строка говорит о бизнес-ситуации с точки зрения значений ее столбца, когда она находится в таблице. Запросы и спецификации.

philipxy 13.06.2019 15:20

Ваш пост является распространенной ошибкой, когда люди хотят присоединиться к общему ключу некоторых агрегаций (каждая из которых может включать объединение), но они ошибочно пытаются выполнить все объединение, а затем все агрегирование или агрегирование по предыдущим агрегациям. Это часто задаваемые вопросы. Прежде чем рассматривать публикацию, пожалуйста, всегда гуглите любое сообщение об ошибке и множество четких, кратких и точных формулировок вашего вопроса/проблемы/цели, с вашими конкретными строками/именами и без них; прочитал много ответов. Если вы публикуете вопрос, используйте одну фразу в качестве заголовка.

philipxy 13.06.2019 15:21
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Суммируйте данные из каждой таблицы отдельно, а затем соедините результаты.

SELECT  AETCC.PayPeriodID, EI.ADP_ID, EI.LastName + ', ' 
 + EI.FirstName AS EmpName, AETCC.LocationNum 
 + '-' + AETCC.CostCenterNum AS CostString, 
 AETCC.LocationNum AS Location, AETCC.CostCenterNum AS CostCenter, 
 AllocationType, AD.TotalHoursWorked as TotalHoursWorked, 
 AD.TotalPercentWorked as TotalPercentWorked, 
 AETCC.ExpenseAmount AS ExpAmt
      FROM (SELECT PayPeriodID, LocationNum, CostCenterNum, ADP_ID, ExpenseAccount,
              SUM(ExpenseAmount) as ExpenseAmount
            FROM dbo.AllocatedExpenseToCostCenter
            GROUP BY PayPeriodID, LocationNum, CostCenterNum, ADP_ID, ExpenseAccount
           ) AS AETCC 
        INNER JOIN
           (SELECT PayPeriodID, LocationNum, CostCenterNum, ADP_ID,
              SUM(TotalHoursWorked) as TotalHoursWorked,
              SUM(TotalPercentWorked) as TotalPercentWorked
            FROM dbo.AllocationData
            GROUP BY PayPeriodID, LocationNum, CostCenterNum, ADP_ID
           ) AS AD
                ON AETCC.ADP_ID = AD.ADP_ID 
                AND AETCC.CostCenterNum = AD.CostCenterNum 
                AND AETCC.LocationNum = AD.LocationNum 
                AND AETCC.PayPeriodID = AD.PayPeriodID 
        INNER JOIN
            dbo.EmployeeInformation AS EI 
                ON AETCC.ADP_ID = EI.ADP_ID
        WHERE        (AETCC.ExpenseAccount = '8000')

Вы также можете переместить предложение WHERE внутрь подзапроса AETCC.

Спасибо, Фред! Это работает отлично. Я ценю экспертизу.

Darrell 13.06.2019 14:37

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