MySQL - 针对两个表计算净额

时间:2011-05-25 00:28:04

标签: mysql join subquery

提前感谢您的任何帮助。我是SQL的新手,已经看过这个网站上的几个相关主题,以及谷歌上的许多其他网站,但还是无法弄清楚我做错了什么。我已经查看了子选择,各种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

问题在于总销售额总计销售交易总数(在这种情况下为4个销售分录总计16584.04)。 4个销售中的每一个都有相关的佣金率。信用额度是佣金的总和(总和) 销售和信用卡号是准确的。但博士的数量应该是3(实践中的医生数量)。会费应为450美元(150x3)。但是你可以看到它乘以4而不是3。 我需要在查询中进行哪些更改以获得正确的计算(医生和会费乘以3而不是4?或者我应该这样做不同吗?再次感谢。

1 个答案:

答案 0 :(得分:0)

您的架构有各种奇怪的事情,并且您没有提供示例数据来证明您的断言值。

第一个奇怪的是,您在Doctors表和Vendor Sales表中拥有医生的名字和姓氏 - 但您只能使用姓氏加入。接下来,您在Doctors表中看到了一个ID列,但您没有在Vendor Sales表中使用该列作为连接列。

目前尚不清楚每位医生的供应商销售表中是否有一个条目,或者是否有多个条目。鉴于您描述的计数问题,我们必须假设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

这两个部分答案需要在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 - 尤其是因为您没有为我们提供适当的样本数据。