Mysql SELECT SQL语句中的多个筛选器

Mysql SELECT SQL语句中的多个筛选器,mysql,excel,vba,Mysql,Excel,Vba,我正在编写一个SQL语句来获取记录集中的一些值,我将使用它将结果传输到Excel表单上的文本框中。所涉及的表格包括: 客户->客户ID、姓氏、姓氏、电话号码 发票->发票ID、客户ID、CarModel、CarColor、CarPlate 维修->维修ID、发票ID、维修类型、车辆部件、价格 服务->服务ID、发票ID、日期、状态 当客户来到车库时,将创建与该客户关联的发票。一张发票可以有许多修理。客户没有修车就走了,但是发票在那里。如果客户决定维修汽车,则会创建一个服务,该服务以“正在维修…

我正在编写一个SQL语句来获取记录集中的一些值,我将使用它将结果传输到Excel表单上的文本框中。所涉及的表格包括:

客户->客户ID、姓氏、姓氏、电话号码

发票->发票ID、客户ID、CarModel、CarColor、CarPlate

维修->维修ID、发票ID、维修类型、车辆部件、价格

服务->服务ID、发票ID、日期、状态

当客户来到车库时,将创建与该客户关联的发票。一张发票可以有许多修理。客户没有修车就走了,但是发票在那里。如果客户决定维修汽车,则会创建一个服务,该服务以“正在维修…”状态开始。服务完成后,状态变为“等待签出…”

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

CarModel、颜色、铭牌、客户名称(姓氏)、喷漆总价值(其中“喷漆”是“类型”列中的一种类型)、其他总价值(本发票中所有其他类型维修的总价)、总价(总价,即喷漆+其他类型)

我写了以下内容,以获取值,但我不知道如何获取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
,选择与类型相关的值:

选择
...
当r.Type='Painting'然后r.Price ELSE 0结束PaintWorkPrice时,
当r.输入“绘画”时,则r.其他价格0结束其他工作价格,
从…起
这是一件事

另一件事是,您没有从
Services
表中选择任何内容,这使得您的查询比需要的复杂得多

如果可以修改架构,请删除
ServiceId
主键字段,并改用
Services.InvoiceId
作为主键:这将自然强制执行1:1关系

来自r的

r.InvoiceId=i.InvoiceId上的内部联接发票i
在i.CustomerId=c.CustomerId上内部加入客户c
您要聚合的数据对于
Repairs
来说是细粒度的,因此您可以从
中选择
,然后通过外键向上移动到
客户

选择
i、 卡莫德尔
,即颜色
,i.盘子
,CONCAT(c.FirstName,,,c.LastName)名称
,当r.Type='Painting'然后r.Price ELSE 0结束PaintWorkPrice时的情况
,当r.键入“绘画”时,则为r.其他价格0结束其他工作价格
,r.Price
来自r
r.InvoiceId=i.InvoiceId上的内部联接发票i
在i.CustomerId=c.CustomerId上内部加入客户c
这还没有汇总:在每个有发票的客户下,每个维修、每个发票都有一个记录。这部分是子查询。如果你有一个参数,那就是你使用它的地方

其中i.InvoiceId=pInvoiceId
如果你只是在硬编码一个ID,那你也可以在那里做

现在在
WHERE
子句下键入
SELECT q.*FROM(
在上一行,并在
WHERE
子句下键入
q.
),然后将
q.
替换为未聚合的字段,并聚合其他字段。结果应该是这样的:

选择
q、 卡莫德尔
,q.颜色
,q板
,q.Name
,合计(q.漆面价格)漆面金额
,总和(q.其他工作价格)其他金额
,合计(q.价格)总金额
从(
挑选
i、 卡莫德尔
,即颜色
,i.盘子
,CONCAT(c.FirstName,,,c.LastName)名称
,当r.Type='Painting'然后r.Price ELSE 0结束PaintWorkPrice时的情况
,当r.键入“绘画”时,则为r.其他价格0结束其他工作价格
,r.Price
来自r
r.InvoiceId=i.InvoiceId上的内部联接发票i
在i.CustomerId=c.CustomerId上内部加入客户c
其中i.InvoiceId=15
)q
分组
q、 卡莫德尔
,q.颜色
,q板
,q.Name

您是否遇到错误?上面说什么?您的查询有一个聚合函数(
SUM
)-记录
GROUP
ed
BY
?未聚合的
SELECT
字段需要位于
GROUP BY
子句中。我编写的语句工作正常,问题是它只给出了总价。由于服务表上总是只有一个唯一的invoiceId,所以返回的记录集只包含一行,这就是为什么我没有使用GROUPBY。。。我试图在“SELECT”和“FROM”之间包含另外两个值(列),这两个值是与invoiceId和type=Painting匹配的价格之和,另一个列是与invoiceId和type NOT Painting(即所有其他类型)匹配的价格之和,这是MySQL还是SQL Server?因为两者的语法不一样。我使用的是Excel上的ODBC对象(VBA),MySQL连接。斯图尔特人是组装服装的人,也就是演员穿的衣服——所以是购车市场的一小部分。也许你在考虑客户(非常感谢:)我会解决所有问题,还有模式。你真的帮了我很多忙!嗨@MathieuGuidon,对不起,我有最后一个问题哈哈,你是如何创建你在问题中插入的表格设计的?