MySQL - Расчет чистых сборов по двум таблицам - PullRequest
0 голосов
/ 25 мая 2011

Заранее спасибо за любую помощь. Я новичок в SQL и просмотрел несколько связанных тем на этом сайте и многих других сайтах в Google, но не смог выяснить, что я делаю неправильно. Я посмотрел на подвыборы, различные варианты JOIN и постоянно сталкивался с неправильным решением / результатом. У меня есть две таблицы, по которым я пытаюсь выполнить запрос.

Table:Doctors 
idDoctors
PracticeID
FirstName
LastName

Table: Vendor Sales
Id
ProductSales
SalesCommission
DoctorFirstName
DoctorLastName

Вот запрос, с которым я борюсь:

SELECT t1.PracticeID
, SUM( t2.ProductSales ) AS Total_Sales
, COUNT( t1.LastName ) AS Doctor_Count
, COUNT( t1.LastName ) *150 AS Dues
, SUM( t2.ProductSales * t2.SalesCommission ) AS Credit
FROM Doctors AS t1
JOIN VendorSales AS t2 ON t1.Lastname = t2.DoctorLastName
GROUP BY t1.PracticeID
LIMIT 0 , 30

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

Результат (в этом примере ограничен одним результатом)

PracticeID  Total_Sales     Doctor_Count    Dues    Credit
Practice A  16583.04               4    600     304.07360

Вот какой должен быть результат:

PracticeID  Total_Sales     Doctor_Count    Dues    Credit
Practice A  16583.04               3    450 304.07360

Проблема в том, что Total Sales суммирует совокупные транзакции продаж (в данном случае 4 записи о продажах на общую сумму 16584.04). Каждый из 4-х продаж имеет соответствующую комиссионную ставку. Сумма кредита - это общая сумма (сумма) комиссии.
Продажи и кредитные номера точны. Но количество докторов должно быть 3 (количество докторов в практике). Сборы должны составлять 450 долларов (150х3). Но, как вы можете видеть, он умножается на 4 вместо 3. Что мне нужно изменить в запросе, чтобы получить правильные расчеты (Врачи и сборы умножены на 3 вместо 4? Или я должен делать это по-другому? Еще раз спасибо.

1 Ответ

0 голосов
/ 25 мая 2011

Существуют различные странные вещи в вашей схеме, и вы не предоставили пример данных, чтобы оправдать свои утвержденные значения.

Первая странность состоит в том, что у вас есть и фамилия, и имя врача в Докторах.таблица, а в таблице Vendor Sales - пока вы присоединяетесь только по фамилии.Далее, у вас есть столбец идентификатора, кажется, в таблице «Доктора», но вы не используете его в таблице «Продажи поставщиков» для присоединяющегося столбца.

Не ясно, есть ли одна запись в поставщике.Таблица продаж на одного врача или их может быть несколько.Учитывая описанные проблемы подсчета, мы должны предположить, что в таблице «Продажи поставщиков» может быть несколько записей на одного врача.Также неясно, где определен поставщик, но мы должны предположить, что это не имеет отношения к проблеме.

Итак, один набор данных, который вам нужен, это количество врачей на практику и сборы.(что составляет 150 денежных единиц на одного врача).Давайте сначала разберемся с этим:

SELECT PracticeID, COUNT(*) AS NumDoctors, COUNT(*) * 150 AS Dues
  FROM Doctors
 GROUP BY PracticeID

Затем нам нужен общий объем продаж в расчете на одну практику, а также кредит:

SELECT t1.PracticeID, SUM(t2.ProductSales) AS Total_Sales,
       SUM(t2.ProductSales * t2.SalesCommission) AS Credit
  FROM Doctors AS t1
  JOIN VendorSales AS t2 ON t1.Lastname = t2.DoctorLastName
 GROUP BY t1.PracticeID

Эти два частичных ответа необходимо объединить на идентификаторе практики дляВы получите свой окончательный результат:

SELECT r1.PracticeID, r1.NumDoctors, r1.Dues,
       r2.Total_Sales, r2. Credit
  FROM (SELECT PracticeID, COUNT(*) AS NumDoctors, COUNT(*) * 150 AS Dues
          FROM Doctors
         GROUP BY PracticeID) AS r1
  JOIN (SELECT t1.PracticeID, SUM(t2.ProductSales) AS Total_Sales,
               SUM(t2.ProductSales * t2.SalesCommission) AS Credit
          FROM Doctors AS t1
          JOIN VendorSales AS t2 ON t1.Lastname = t2.DoctorLastName
         GROUP BY t1.PracticeID) AS r2
    ON r1.PracticeID = r2.PracticeID;

Это должно дать вам результат, к которому вы стремитесь, я считаю.Но это непроверенный SQL - не в последнюю очередь потому, что вы не предоставили нам соответствующие примеры данных для работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...