Mysql SQL查询后,如何获取两条记录之间的差异?

Mysql SQL查询后,如何获取两条记录之间的差异?,mysql,Mysql,我想在查询后得到两条记录之间的差异 以下是查询: select count(t.customerid) as NumberofCustomers, st.regionid, v.vendorid from region r join store st on r.regionid = st.regionid join salestransaction t on st.storeid = t.storeid join soldvia s on t.tid = s.tid join product

我想在查询后得到两条记录之间的差异

以下是查询:

select count(t.customerid) as NumberofCustomers, st.regionid, v.vendorid
from region r join store st
on r.regionid = st.regionid
join salestransaction t 
on st.storeid = t.storeid
join soldvia s
on t.tid = s.tid
join product p
on s.productid = p.productid
join vendor v
on p.vendorid = v.vendorid
where v.vendorid = 2
group by st.regionid, v.vendorid
这是查询产生的结果:

NumberofCustomers   regionid    vendorid
     495               1            2
     329               2            2
如何获得第1行和第2行中的客户数之间的差异? 我曾试图用差异来实现这一点,但它并没有给我想要的结果


任何帮助都将不胜感激

你的目标很奇怪。但我有一个有趣而奇怪的解决方案:

SELECT t.*,
   IF(@prev IS NULL, t.NumberofCustomers, (t.NumberofCustomers- @prev)) difference,
   @prev := t.NumberofCustomers
FROM )
select count(t.customerid) as NumberofCustomers, 
   st.regionid, v.vendorid
from region r join store st
on r.regionid = st.regionid
join salestransaction t 
on st.storeid = t.storeid
join soldvia s
on t.tid = s.tid
join product p
on s.productid = p.productid
join vendor v
on p.vendorid = v.vendorid
where v.vendorid = 2
group by st.regionid, v.vendorid ) t

你的目标很奇怪。但我有一个有趣而奇怪的解决方案:

SELECT t.*,
   IF(@prev IS NULL, t.NumberofCustomers, (t.NumberofCustomers- @prev)) difference,
   @prev := t.NumberofCustomers
FROM )
select count(t.customerid) as NumberofCustomers, 
   st.regionid, v.vendorid
from region r join store st
on r.regionid = st.regionid
join salestransaction t 
on st.storeid = t.storeid
join soldvia s
on t.tid = s.tid
join product p
on s.productid = p.productid
join vendor v
on p.vendorid = v.vendorid
where v.vendorid = 2
group by st.regionid, v.vendorid ) t

如果只有两个区域,则可以使用条件聚合:

select v.vendorid,
       sum(st.regionid = 1) as NumRegion1,
       sum(st.regionid = 2) as NumRegion2,
       (sum(st.regionid = 1) - sum(st.regionid = 2)) as diff
from region r join
     store st
     on r.regionid = st.regionid join
     salestransaction t 
     on st.storeid = t.storeid join
     soldvia s
     on t.tid = s.tid join
     product p
     on s.productid = p.productid join
     vendor v
     on p.vendorid = v.vendorid
where v.vendorid = 2
group by v.vendorid;

返回一行中的所有数字,而不是两行。

如果只有两个区域,则可以使用条件聚合:

select v.vendorid,
       sum(st.regionid = 1) as NumRegion1,
       sum(st.regionid = 2) as NumRegion2,
       (sum(st.regionid = 1) - sum(st.regionid = 2)) as diff
from region r join
     store st
     on r.regionid = st.regionid join
     salestransaction t 
     on st.storeid = t.storeid join
     soldvia s
     on t.tid = s.tid join
     product p
     on s.productid = p.productid join
     vendor v
     on p.vendorid = v.vendorid
where v.vendorid = 2
group by v.vendorid;


返回的数字都是一行,而不是两行。

你怎么知道你正好有两行?@GordonLinoff比我快。有趣的是,我们马上就想到了同一件事,因为只有两件regions@UKcats82,理想情况下,您希望在单独的子查询(a、b)中针对减法的每个部分(每个
NumberofCustomers
),以便可以从上面减法:
选择a.NumberofCustomers-b.NumberofCustomers from…
。这将使您更好地了解记录的唯一性。@UKcats82,依赖您对数据的了解是非常糟糕的做法。SQL设计和开发的pilars是数据库体系结构,最好只依赖它。通过这一点,我了解到,除非有约束或触发器强制执行2行和2行这一事实,否则您应该假设一天可能有1行、3行或更多行,无论是否有充分的理由。如果
regionid
是唯一的,那么在子查询
where
条件中明确地命名它,以确保子查询返回1行,并且正好是您想要的行。您如何知道您正好有两行?@GordonLinoff告诉了我。有趣的是,我们马上就想到了同一件事,因为只有两件regions@UKcats82,理想情况下,您希望在单独的子查询(a、b)中针对减法的每个部分(每个
NumberofCustomers
),以便可以从上面减法:
选择a.NumberofCustomers-b.NumberofCustomers from…
。这将使您更好地了解记录的唯一性。@UKcats82,依赖您对数据的了解是非常糟糕的做法。SQL设计和开发的pilars是数据库体系结构,最好只依赖它。通过这一点,我了解到,除非有约束或触发器强制执行2行和2行这一事实,否则您应该假设一天可能有1行、3行或更多行,无论是否有充分的理由。如果
regionid
是唯一的,那么在子查询
where
条件中明确地命名它,以确保子查询返回1行,并且正好是您想要的行。这是一个奇怪的问题。这是另一个问题,您将如何在SSMS中执行相同的操作?我正在努力精通这两个方面,只是想看看它,因为这是一个独特的问题/答案。你能给我解释一下,或者给我一个指向SSM定义的链接吗?因为对我来说,这听起来很新鲜,只不过是SQLServerManagementStudio(SSMS)。我认为称之为SSMS很常见,但我肯定是错的。所以你们使用mysql,但你们也想要sql解决方案吗?为什么?只是因为我喜欢看到它们之间的差异和它的独特性,我想知道如何在每个方面做到这一点。我是个失败者,这就是为什么。这是个奇怪的问题。这是另一个问题,您将如何在SSMS中执行相同的操作?我正在努力精通这两个方面,只是想看看它,因为这是一个独特的问题/答案。你能给我解释一下,或者给我一个指向SSM定义的链接吗?因为对我来说,这听起来很新鲜,只不过是SQLServerManagementStudio(SSMS)。我认为称之为SSMS很常见,但我肯定是错的。所以你们使用mysql,但你们也想要sql解决方案吗?为什么?只是因为我喜欢看到它们之间的差异和它的独特性,我想知道如何在每个方面做到这一点。我是个失败者,这就是为什么。