SELECT SQL Statment中的多重筛选器
我正在写一个SQL语句来获取Recordset中的一些值,我将使用它将结果传送到Excel中的Form中的TextBoxes。 涉及的表格有:
客户 – > CustomerId,名字,姓氏,电话号码
发票 – > InvoiceId,CustomerId,CarModel,CarColor,CarPlate
修理 – > RepairId,InvoiceId,TypeOfRepair,PartOfCar,Price
服务 – > ServiceId,InvoiceId,date,状态
当客户进入车库时,将创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