表 1:发票(inv_id、inv_value、cust_id)
表 2:客户(cust_id、sales_rep)
表 3:成员(Member_id、member_cateogry、member_type、cust_id)
注1:每个客户支付多张发票。(一对多关系)。< br >注2:每个客户为一个或多个会员付费(因此一个客户可能与多个会员相关)。< br >注3:每个成员都有一个类别,可以是1“代表个人”或2“代表团体”。< br >注4:每个成员都有一个类型,可以是1“代表新”或2“代表更新”。
我想为sales_rep
=1、member_category
=10、
members_type=123的客户获取
我试过了:
SELECT Sum(invoices.inv_value) AS total
FROM invoices,
customers,
members
WHERE invoices.cust_id = customers.cust_id
AND members.custid = customers.cust_id
AND members.category = {$category}
AND members_type = {$type}
AND customers.sales_rep = {$id}";
和
SELECT Sum(invoices.inv_value) AS total
FROM members
INNER JOIN customers
ON members.custid = customers.cust_id
INNER JOIN invoices
ON customers.cust_id = invoices.cust_id
WHERE customers.sales_rep = {$id}
AND members.category = {$category}
AND members.type = {$type}";
但两者都返回双倍的发票值。
例如:使用这些 sql 查询,发票表中的 1 张 120 美元的发票返回 240 美元。
我该如何解决这个问题?
您似乎是从< code >发票中提取< code>inv_value,它与< code >客户有多对一关系,但< code >客户表和< code >成员表有一对多关系。
说你有以下数据
发票表
invoices.cust_id invoices.inv_value
custid1 100
客户表
customer.cust_id
custid1
成员表
members.cust_id members.category
custid1 1
custid1 2
在连接所有三个表时
customer.cust_id members.cust_id invoices.inv_value members.category
custid1 custid1 100 1
custid1 custid1 100 2
如果您注意到<;code>;custid1<;/code>;存在于2<;code;membercategory<;/code<;中,<;代码>;发票值>;也会重复。
要解决这个问题,首先可以获取不同的记录,然后将这些不同的记录相加将有助于解决问题,如下所示
解决方案
SELECT Sum(invoices.inv_value) AS total
FROM(
SELECT DISTINCT members.custid, invoices.inv_value inv_value
FROM members
INNER JOIN customers
ON members.custid = customers.cust_id
INNER JOIN invoices
ON customers.cust_id = invoices.cust_id
WHERE customers.sales_rep = {$id}
AND members.category = {$category}
AND members.type = {$type});
这是你的疑问:
SELECT sum(i.inv_value) as total
FROM members m INNER JOIN
customers c
ON m.custid = c.cust_id INNER JOIN
invoices i
ON c.cust_id = i.cust_id
WHERE c.sales_rep = {$id} AND
m.category = {$category} AND
m.type = {$type}";
(不要使用逗号使用隐式JOIN
语法。它过时且功能较弱。)
问题可能是两个成员可能具有相同的客户id。您可以通过运行以下命令来检查:
select m.cust_id, count(*)
from members m
group by m.cust_id
having count(*) > 1;
客户id也可能在< code >客户中重复。
假设重复项仅存在于成员
中,请将查询更改为exists
:
SELECT sum(i.inv_value) as total
FROM customers c
ON INNER JOIN
invoices i
ON c.cust_id = i.cust_id
WHERE c.sales_rep = {$id} AND
EXISTS (SELECT 1
FROM members m
WHERE m.custid = c.cust_id AND
m.category = {$category} AND
m.type = {$type}
);
问题内容: 我有两个表: 这是表1: 这是表2: 现在,我想从这些表中获取数据。在两个表中都相同。 我想拿 和其他表。 请帮我做到这一点。 问题答案: 我假设您在第二个表中有一个命名字段(您没有列出它): 您应该查看有关的MySQL手册,因为这是编写SQL查询的非常基本的部分。您也可以考虑为product_id字段添加索引,以使查询运行更快。
问题内容: 使用SQL SERVER。 数据库包含不同年份的数据,我想以某种方式获取所有数据(所有年份)并显示给用户,例如,数据库包含表: 现在通过从information_schema.tables中选择TABLE_NAME到@tableName中,其中table_name如’records_%’ 我可以获取所有表名,如何编写SQL(或过程)以从这些表中获取所有数据?将所有记录合并到一个表中?
问题内容: 我有三个表,其中两个是主表,另一个是map。它们在下面给出。 tbl_Category,具有列ID(PK)和名称 / * / tbl_SubCategory Id SubCategoryName CategoryId (FK, PK of above) 2 Badges, Emblems, Ribbons & Allied 2 3 Barcodes, Stickers & Labels
问题内容: 我在单个SQL语句中从多个表中提取Sums时遇到问题。 我有三个表tblCases,tblTimesheetEntries和tblInvoices在tblCases和其他两个表之间存在一对多的关系。 我目前正在使用以下SQL语句 但是,这似乎重复了发票金额。例如,如果一个案例只有一张发票,但是说有4个时间表条目,则它将计算出发票金额的4倍作为该表的总和。 如果我将分组取出,然后运行以下
我有三张桌子:
问题内容: 假设有两个表: 表A 表B 表之间的联系是 messageID 字段。 我想要一个查询来生成这样的结果,在该查询中,我将所有字段从表A中拉出,并对表B中每条消息的注释数进行计数,如下所示: 我已经尝试过这样的事情: 但这是行不通的。有任何想法吗?似乎应该可以在一个查询中执行此操作。我正在使用MSSQL。谢谢你的帮助。 问题答案: 标量子查询将起作用: 与往常一样,有很多方法可以改变这只