提前感谢您的任何帮助。我是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?或者我应该这样做不同吗?再次感谢。
答案 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 - 尤其是因为您没有为我们提供适当的样本数据。