Mysql SELECT SQL语句中的多个筛选器
我正在编写一个SQL语句来获取记录集中的一些值,我将使用它将结果传输到Excel表单上的文本框中。所涉及的表格包括: 客户->客户ID、姓氏、姓氏、电话号码 发票->发票ID、客户ID、CarModel、CarColor、CarPlate 维修->维修ID、发票ID、维修类型、车辆部件、价格 服务->服务ID、发票ID、日期、状态 当客户来到车库时,将创建与该客户关联的发票。一张发票可以有许多修理。客户没有修车就走了,但是发票在那里。如果客户决定维修汽车,则会创建一个服务,该服务以“正在维修…”状态开始。服务完成后,状态变为“等待签出…” 我想使用SQL语句检索特定InvoiceId的以下值(列): CarModel、颜色、铭牌、客户名称(姓氏)、喷漆总价值(其中“喷漆”是“类型”列中的一种类型)、其他总价值(本发票中所有其他类型维修的总价)、总价(总价,即喷漆+其他类型) 我写了以下内容,以获取值,但我不知道如何获取PaintingTotalValue和OtherTotalVAlueMysql SELECT SQL语句中的多个筛选器,mysql,excel,vba,Mysql,Excel,Vba,我正在编写一个SQL语句来获取记录集中的一些值,我将使用它将结果传输到Excel表单上的文本框中。所涉及的表格包括: 客户->客户ID、姓氏、姓氏、电话号码 发票->发票ID、客户ID、CarModel、CarColor、CarPlate 维修->维修ID、发票ID、维修类型、车辆部件、价格 服务->服务ID、发票ID、日期、状态 当客户来到车库时,将创建与该客户关联的发票。一张发票可以有许多修理。客户没有修车就走了,但是发票在那里。如果客户决定维修汽车,则会创建一个服务,该服务以“正在维修…
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
edBY
?未聚合的SELECT
字段需要位于GROUP BY
子句中。我编写的语句工作正常,问题是它只给出了总价。由于服务表上总是只有一个唯一的invoiceId,所以返回的记录集只包含一行,这就是为什么我没有使用GROUPBY。。。我试图在“SELECT”和“FROM”之间包含另外两个值(列),这两个值是与invoiceId和type=Painting匹配的价格之和,另一个列是与invoiceId和type NOT Painting(即所有其他类型)匹配的价格之和,这是MySQL还是SQL Server?因为两者的语法不一样。我使用的是Excel上的ODBC对象(VBA),MySQL连接。斯图尔特人是组装服装的人,也就是演员穿的衣服——所以是购车市场的一小部分。也许你在考虑客户(非常感谢:)我会解决所有问题,还有模式。你真的帮了我很多忙!嗨@MathieuGuidon,对不起,我有最后一个问题哈哈,你是如何创建你在问题中插入的表格设计的?