我正在编写一个SQL语句来获取Recordset中的一些值,我将使用它将结果传输到Excel中的Form上的TextBoxes。涉及的表格是:
客户 - > CustomerId,FirstName,LastName,TelNumber
发票 - > InvoiceId,CustomerId,CarModel,CarColor,CarPlate
维修 - > RepairId,InvoiceId,TypeOfRepair,PartOfCar,Price
服务 - > ServiceId,InvoiceId,日期,状态
当客户来到Garage时,会创建一个与此客户关联的发票。发票可以有很多维修。客户在没有修理汽车的情况下离开,但发票就在那里。如果客户决定修理汽车,则会创建一个服务,该服务从状态“正在工作......”开始。服务完成后,状态将更改为“等待结账...”
我想使用SQL语句检索特定InvoiceId的以下值(列):
CarModel,Color,Plate,CustomerName(FirstName LastName),PaintingTotalValue(其中'Painting'是'Type'列中的一种类型),OtherTotalValue(此发票中所有其他类型修复的总价),总价(总价,即绘画+其他)。
我写了以下内容,以获取值,但我不知道如何获取PaintingTotalValue和OtherTotalVAlue。
SELECT i.CarModel, i.Color, i.Plate, CONCAT(c.FirstName,' ',c.LastName) AS Name, FORMAT(SUM(r.Price),2) AS TotalPrice
FROM Services AS s INNER JOIN Invoices AS i ON s.invoiceId=i.invoiceId
INNER JOIN Repairs AS r ON s.invoiceId=r.invoiceId
INNER JOIN Customers AS c ON i.customerId=c.customerId
WHERE s.invoiceId = 15
答案 0 :(得分:3)
在CASE WHEN
子句中使用SELECT
,选择以该类型为条件的值:
SELECT
...
CASE WHEN r.Type = 'Painting' THEN r.Price ELSE 0 END PaintWorkPrice,
CASE WHEN r.Type <> 'Painting' THEN r.Price ELSE 0 END OtherWorkPrice,
FROM ...
这是一回事。
另一件事是你没有从Services
表中选择任何内容,并使你的查询比它需要的要复杂得多。
如果您可以修改架构,请删除
ServiceId
主键字段,然后使用Services.InvoiceId
作为主键:这将自然地强制执行1:1关系。
FROM Repairs r
INNER JOIN Invoices i ON r.InvoiceId = i.InvoiceId
INNER JOIN Customers c ON i.CustomerId = c.CustomerId
您要汇总的数据精确到Repairs
,因此您选择FROM
,然后通过外键移动到Customers
。
SELECT
i.CarModel
,i.Color
,i.Plate
,CONCAT(c.FirstName,' ',c.LastName) Name
,CASE WHEN r.Type = 'Painting' THEN r.Price ELSE 0 END PaintWorkPrice
,CASE WHEN r.Type <> 'Painting' THEN r.Price ELSE 0 END OtherWorkPrice
,r.Price
FROM Repairs r
INNER JOIN Invoices i ON r.InvoiceId = i.InvoiceId
INNER JOIN Customers c ON i.CustomerId = c.CustomerId
尚未汇总:每个发票的每个维修都有一个记录,每个发票都有一张发票。那部分是子查询。如果你有一个参数,那就是你使用它的地方。
WHERE i.InvoiceId = pInvoiceId
如果您只是对ID进行硬编码,那么您也可以这样做。
现在在上面一行输入SELECT q.* FROM (
,在) q
子句下输入WHERE
,然后将q.*
替换为您未汇总的字段 - 并汇总其他。结果应该是这样的:
SELECT
q.CarModel
,q.Color
,q.Plate
,q.Name
,SUM(q.PaintWorkPrice) PaintAmount
,SUM(q.OtherWorkPrice) OtherAmount
,SUM(q.Price) TotalAmount
FROM (
SELECT
i.CarModel
,i.Color
,i.Plate
,CONCAT(c.FirstName,' ',c.LastName) Name
,CASE WHEN r.Type = 'Painting' THEN r.Price ELSE 0 END PaintWorkPrice
,CASE WHEN r.Type <> 'Painting' THEN r.Price ELSE 0 END OtherWorkPrice
,r.Price
FROM Repairs r
INNER JOIN Invoices i ON r.InvoiceId = i.InvoiceId
INNER JOIN Customers c ON i.CustomerId = c.CustomerId
WHERE i.InvoiceId = 15
) q
GROUP BY
q.CarModel
,q.Color
,q.Plate
,q.Name