sql 左连接查询出来的求各结果不准确,被乘了2倍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 左连接查询出来的求各结果不准确,被乘了2倍相关的知识,希望对你有一定的参考价值。

select a.*
,sum(c.[在11月份一级渠道协议上户量]) as [在11月份一级渠道协议上户量]
,sum(c.[在12月份一级渠道协议上户量]) as [在12月份一级渠道协议上户量]
,sum(c.[在12月份一级渠道协议上户量]-c.[在11月份一级渠道协议上户量]) as 辖区一级渠道上户量环比
,sum(b.[在201312激活且在网90天用户数]) as [在201312激活且在网90天用户数]
,sum(b.[在201401激活且在网90天用户数]) as [在201401激活且在网90天用户数]
,sum(b.[在201402激活且在网90天用户数]) as [在201402激活且在网90天用户数]

FROM [sc市场销售部].[dbo].[2013年底标卡认购任务基数_罗峰_提卡用户数] as a
left join [sc市场销售部].[dbo].[2013年底标卡认购任务基数_罗峰_一级渠道协议上户量] as c
on (a.[乡镇办名称]=c.[营销中心名称] or a.[乡镇办名称]=c.[网格名称])

left join [sc市场销售部].[dbo].[2013年底标卡认购任务基数_罗峰_激活用户数] as b
on (a.[乡镇办名称]=b.[营销中心名称] or a.[乡镇办名称]=b.[网格名称])
group by a.[区县]
,a.[乡镇办名称]
,a.[终端认购基础任务]
,a.[标准卡认购基础任务]
,a.[备注]
,a.[提卡用户数]
我的这个结果,C表的结果被乘了3倍;B表的结果被乘了2倍。。。。那正确的写法应该如何 ?

a与b和c分别做左连接后再把数据合并

select t1.*,t2.[在201312激活且在网90天用户数],t2.[在201401激活且在网90天用户数],t2.[在201402激活且在网90天用户数]
from
(select a.*
      ,sum(c.[在11月份一级渠道协议上户量]) as [在11月份一级渠道协议上户量]
      ,sum(c.[在12月份一级渠道协议上户量]) as [在12月份一级渠道协议上户量]
      ,sum(c.[在12月份一级渠道协议上户量]-c.[在11月份一级渠道协议上户量]) as 辖区一级渠道上户量环比
FROM [sc市场销售部].[dbo].[2013年底标卡认购任务基数_罗峰_提卡用户数] as a
left join [sc市场销售部].[dbo].[2013年底标卡认购任务基数_罗峰_一级渠道协议上户量] as c
on (a.[乡镇办名称]=c.[营销中心名称] or a.[乡镇办名称]=c.[网格名称])
group by a.[区县]
      ,a.[乡镇办名称]
      ,a.[终端认购基础任务]
      ,a.[标准卡认购基础任务]
      ,a.[备注]
      ,a.[提卡用户数]) t1,      
(select a.*      
      ,sum(b.[在201312激活且在网90天用户数]) as [在201312激活且在网90天用户数]
      ,sum(b.[在201401激活且在网90天用户数]) as [在201401激活且在网90天用户数]
      ,sum(b.[在201402激活且在网90天用户数]) as [在201402激活且在网90天用户数] 
FROM [sc市场销售部].[dbo].[2013年底标卡认购任务基数_罗峰_提卡用户数] as a     
left join [sc市场销售部].[dbo].[2013年底标卡认购任务基数_罗峰_激活用户数] as b
on (a.[乡镇办名称]=b.[营销中心名称] or a.[乡镇办名称]=b.[网格名称])
group by a.[区县]
      ,a.[乡镇办名称]
      ,a.[终端认购基础任务]
      ,a.[标准卡认购基础任务]
      ,a.[备注]
      ,a.[提卡用户数]) t2
where t1.[区县]=t2.[区县]
      ,t1.[乡镇办名称]=t2.[乡镇办名称]
      ,t1.[终端认购基础任务]=t2.[终端认购基础任务]
      ,t1.[标准卡认购基础任务]=t2.[标准卡认购基础任务]
      ,t1.[备注]=t2.[备注]
      ,t1.[提卡用户数]=t2.[提卡用户数]追问

您好。。。我之前的写法问题出在哪里呢 ?莫非多个条左连接后不能求和 ?
我试了
select a.*,b.*,c.*
from aa as a
left join bb as b
on a.a1=b.b1
left join cc as c
on a.a2=c.1
这样出来 的结果 并没有多条同样的记录 啊

追答create table a
(id int)

create table b
(id int,
value int)

create table c
(id int,
value int)

insert into a values (1)
insert into a values (2)

insert into b values (1,10)
insert into b values (1,20)

insert into c values (1,10)
insert into c values (2,20)



select *
from a left join b on a.id=b.id
left join c on a.id=c.id

你自己试试吧,一个主表和2个明细表关联后,这样的结果肯定不对

参考技术A 那是因为 left join 右边的表 同样的数据有2条追问

我的这个结果,C表的结果被乘了3倍;B表的结果被乘了2倍。。。。那正确的写法应该如何 ?

追答

不知道你的数据形式,没法给你写

在两个表上分组并在结果VBA ADODB SQL查询上执行左连接

我想在两个csv文件上执行Group BY,然后通过Excel中的VBA ADO查询对两个表的结果执行左连接。我的最终动机是打印记录集。

这是我到目前为止所做的。

     SELECT * FROM (
                   SELECT   f1.[c3],
                            f1.[c4],
                            f1.[c5],
                            f1.[c6],
                            Sum(f1.[c8]) AS SUMDATA
                   FROM     test1.csv F1 
                   GROUP BY f1.[c3],
                            f1.[c4],
                            f1.[c5],
                            f1.[c6]) AS f3
LEFT JOIN  SELECT * FROM   (
                SELECT   f2.[c3],
                         f2.[c4],
                         f2.[c5],
                         f2.[c6],
                         Sum(f2.[c8]) AS SUMDATA
                FROM     test2.csv f2
                GROUP BY f2.[c3],
                         f2.[c4],
                         f2.[c5],
                         f2.[c6]) AS f4
on  f3.[c3]+ f3.[c4]+ f3.[c5]+ f3.[c6] = f4.[c3]+ f4.[c4]+ f4.[c5]+ f4.[c6]
WHERE  f3.[SUMDATA] <> f4.[SUMDATA] 

这显示语法错误。怎么实现这个?任何帮助深表感谢。 TIA。

更新 -

我设法在2个表之间实现1个LEFT JOIN和2个GROUP BYs。根据请求,这里有关于我的数据集的一些细节。它由字段组成 - c1,c2 .... c8。 c8是我的目标领域。

我的预期输出 - 我不需要输出表中的c7,c1和c2。 c7,c1和c2的信息无关紧要。我需要用我的数据做5件事。

  1. 组基于CSV文件1中的c3,c4,c5和c6字段对c8字段求和,并将目标字段存储为SUMDATA
  2. 组基于CSV文件2中的c3,c4,c5和c6字段对c8字段求和,并将目标字段存储为SUMDATA
  3. 在CSV1和CSV2之间找到不匹配的SUMDATA字段条目(我在连接的c3,c4,c5,c6字段上使用了LEFT JOIN
  4. 查找CSV1中存在但CSV2中不存在的条目
  5. 查找CSV2中存在但CSV1中不存在的条目

目前,我设法编写直到第3步的代码。我需要暂时存储我从步骤1和2获得的分组表,以执行步骤4和5,这可以通过另外两个UNIONLEFT JOINsWHERE组合。这就是我现在被困住的地方。

答案

这不是一个真正的答案,但格式化对于可读性很重要。

你的SQL看起来有很多问题。

语法应如下所示(假设查询csv就像你在想的那样):

SELECT SUB1.Field1,
       SUB1.AggField AS Agg1,
       SUB2.AggField AS Agg2
  FROM (SELECT Field1,
               MAX(Field2) Agg_Field
          FROM Table1 T1
         GROUP
            BY Field1
       ) SUB1
  LEFT
  JOIN (SELECT Field1,
               MAX(Field2) Agg_Field
          FROM Table1 T2
         GROUP
            BY Field1
       ) SUB2
    ON SUB1.Field1 = SUB2.Field1
 WHERE SUB1.AggField <> SUB2.AggField;

此外,你在这里缺少一个逗号:F1。[c5] F1。[c6]在第一个块中。

尝试修复这样的SQL语法,看看它能带给你什么。

以上是关于sql 左连接查询出来的求各结果不准确,被乘了2倍的主要内容,如果未能解决你的问题,请参考以下文章

sql多表连接查询问题

mysql左连接没有数据还会查出来吗

转载-- SQL连接查询2 外连接(左右联接查询)

Hive SQL 多个左外连接查询在其结果中缺少记录

Mybatis-----查询结果合并成集合

连接两表查询结果的SQL语句