SELECT SQL Statment中的多重筛选器

我正在写一个SQL语句来获取Recordset中的一些值,我将使用它将结果传送到Excel中的Form中的TextBoxes。 涉及的表格有:

客户 – > CustomerId,名字,姓氏,电话号码

发票 – > InvoiceId,CustomerId,CarModel,CarColor,CarPlate

修理 – > RepairId,InvoiceId,TypeOfRepair,PartOfCar,Price

服务 – > ServiceId,InvoiceId,date,状态

模式的sc y yUML图

当客户进入车库时,将创build与此客户相关联的发票。 发票可以有许多修理。 客户没有修理汽车,但发票在那里。 如果客户决定修理汽车,则会创build一个服务,该服务以状态“正在工作…”开始。 服务完成后,状态变为“正在等待结帐…”

我想使用SQL语句来检索特定InvoiceId的以下值(列):

(其中“绘画”是“types”列中的一种types),OtherTotalValue(此发票中所有其他types的修复的总价格),总价格(总价格),CarModel,颜色,板,CustomerName(名字姓氏),PaintingTotalValue ,也就是画+其他)。

我写了以下内容,以获取值,但我不知道如何获取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 

在你的SELECT子句中使用CASE WHEN来select条件types的值:

 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表中select任何东西,并且使你的查询比需要的复杂得多。

如果您可以修改架构,请删除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是细化的,所以您selectFROM ,然后通过外键转移到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 

这还没有汇总:每个维修logging,每个发票,每个有发票的客户。 这部分是子查询 。 如果你有一个参数,那就是你使用它的地方。

 WHERE i.InvoiceId = pInvoiceId 

如果你只是对一个ID进行硬编码,那么你也是这样做的。

现在,在WHERE子句下面inputSELECT q.* FROM (在上面的行中) q ,然后将q.*replace为你没有聚合的字段,然后聚合其他的。 结果应该是这样的:

 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