Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 连接时防止双重/三重消耗_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql 连接时防止双重/三重消耗

Sql 连接时防止双重/三重消耗,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我加入了两个表格:账户人口统计和账户支付。这两个表之间的关系是accn_demographics.accn_id和accn_payments.accn_id之间的一对多关系 我的问题是,当我将已付金额和共付金额相加时,我得到的是我应该得到的数字的两倍/三倍/四倍 我的加入条件是否存在明显问题 select sum(p.paid_amt) as SumPaidAmount , sum(p.copay_amt) as SumCoPay , p.pmt_date , d.loa

我加入了两个表格:账户人口统计和账户支付。这两个表之间的关系是accn_demographics.accn_id和accn_payments.accn_id之间的一对多关系

我的问题是,当我将已付金额和共付金额相加时,我得到的是我应该得到的数字的两倍/三倍/四倍

我的加入条件是否存在明显问题

select sum(p.paid_amt) as SumPaidAmount
    , sum(p.copay_amt) as SumCoPay
    , p.pmt_date
    , d.load_Date
    , p.ACCN_ID
from  accn_payments p
join 
(
    select distinct load_date, accn_id 
    from accn_demographics
) d
    on p.ACCN_ID=d.ACCN_ID
where p.POSTED='Y'
    and p.pmt_date between '20120701' and '20120731'
group by p.pmt_date, d.load_Date,p.ACCN_ID
order by 3 desc

非常感谢您的指导。

如果选择不同的加载日期,我唯一能看到的就是从accn\u人口统计中选择accn\u id可能会返回多个匹配项。查看数据并运行单独的查询

select distinct load_date, accn_id from accn_demographics WHERE accn_id=SomeID

其中SomeID是返回双/三重值的结果帐户之一。这应该可以指出您的问题。

如果从accn\u人口统计中选择不同的加载日期、accn\u id,我唯一能看到的可能是返回几个匹配项。查看数据并运行单独的查询

select distinct load_date, accn_id from accn_demographics WHERE accn_id=SomeID

其中SomeID是返回双/三重值的结果帐户之一。这应该可以指出您的问题。

您需要在子查询中进行求和:

select sum(p.SumPaidAmount) as SumPaidAmount, sum(p.SumCoPay) as SumCoPay,
       p.pmt_date, d.load_Date, p.ACCN_ID
from  (select accn_id, p.pmt_date, sum(paid_amt) as SumPaidAmt,
              sum(copay_amt) as SumCoPay
       from accn_payments p
       where p.POSTED='Y' and
             p.pmt_date between '20120701' and '20120731'
       group by accn_id, pmt_date
      ) p join
      (select distinct load_date, accn_id from accn_demographics) d
      on p.ACCN_ID=d.ACCN_ID
group by p.pmt_date, d.load_Date,p.ACCN_ID
order by 3 desc

问:你真的打算让pmt_日期出现在最终结果中吗?看起来您希望将其从外部选择和子查询中删除。

您需要在子查询中进行求和:

select sum(p.SumPaidAmount) as SumPaidAmount, sum(p.SumCoPay) as SumCoPay,
       p.pmt_date, d.load_Date, p.ACCN_ID
from  (select accn_id, p.pmt_date, sum(paid_amt) as SumPaidAmt,
              sum(copay_amt) as SumCoPay
       from accn_payments p
       where p.POSTED='Y' and
             p.pmt_date between '20120701' and '20120731'
       group by accn_id, pmt_date
      ) p join
      (select distinct load_date, accn_id from accn_demographics) d
      on p.ACCN_ID=d.ACCN_ID
group by p.pmt_date, d.load_Date,p.ACCN_ID
order by 3 desc

问:你真的打算让pmt_日期出现在最终结果中吗?看起来您希望将其从外部选择和子查询中删除。

是的,但对于初学者来说这并不明显。发生的情况是,对于每个accn_付款记录,您只匹配accn_id,这意味着如果该特定accn_id的accn_人口统计中有多个记录,则由于加入,您将获得重复的accn_付款记录。在accn_的人口统计数据中是否有其他限制字段加入到支付中

最后,请这样想:

账户付款:

accn_id    |    paid_amt    |    copay_amt    |  ...
----------------------------------------------------
1          |    100.00      |    20.00        |  ...
accn_人口统计d:

accn_id    |    load_date   |    ...
------------------------------------
1          |    2012/01/01  |    ...
1          |    2012/03/05  |    ...
1          |    2012/06/23  |    ...
加入后,您的结果将如下所示:

p.accn_id | p.paid_amt | p.copay_amt | p... | d.accn_id | d.load_date | d...
----------------------------------------------------------------------------
1         | 100.00     | 20.00       | .... | 1         | 2012/01/01  | ....
1         | 100.00     | 20.00       | .... | 1         | 2012/03/05  | ....
1         | 100.00     | 20.00       | .... | 1         | 2012/06/21  | ....
如您所见,每个匹配的accn_人口统计记录都会复制accn_payments中的同一行,因为您只将accn_id列指定为联接条件。它不能进一步限制结果,所以数据库引擎说,嘿,看,这个p记录匹配所有这些d记录,这一定是他想要的!显然不是预期的,因为当您对p.paid_amt和p.copay_amt求和时,它会对所有行执行求和,即使它们是重复的


最后,看看您是否可以在某个日期进一步限制accn_人口统计的加入标准,也许这样您就可以限制加入过程中重复付款记录的数量。

是的,但这对于初学者来说并不明显。发生的情况是,对于每个accn_付款记录,您只匹配accn_id,这意味着如果该特定accn_id的accn_人口统计中有多个记录,则由于加入,您将获得重复的accn_付款记录。在accn_的人口统计数据中是否有其他限制字段加入到支付中

最后,请这样想:

账户付款:

accn_id    |    paid_amt    |    copay_amt    |  ...
----------------------------------------------------
1          |    100.00      |    20.00        |  ...
accn_人口统计d:

accn_id    |    load_date   |    ...
------------------------------------
1          |    2012/01/01  |    ...
1          |    2012/03/05  |    ...
1          |    2012/06/23  |    ...
加入后,您的结果将如下所示:

p.accn_id | p.paid_amt | p.copay_amt | p... | d.accn_id | d.load_date | d...
----------------------------------------------------------------------------
1         | 100.00     | 20.00       | .... | 1         | 2012/01/01  | ....
1         | 100.00     | 20.00       | .... | 1         | 2012/03/05  | ....
1         | 100.00     | 20.00       | .... | 1         | 2012/06/21  | ....
如您所见,每个匹配的accn_人口统计记录都会复制accn_payments中的同一行,因为您只将accn_id列指定为联接条件。它不能进一步限制结果,所以数据库引擎说,嘿,看,这个p记录匹配所有这些d记录,这一定是他想要的!显然不是预期的,因为当您对p.paid_amt和p.copay_amt求和时,它会对所有行执行求和,即使它们是重复的


最后,看看是否可以在某个日期进一步限制accn_人口统计的加入标准,这样可以限制加入期间重复付款记录的数量。

帐户统计信息中是否有多行具有相同的帐户id和不同的加载日期值?能否在SqlFIDLE中的任意位置显示示例数据和预期输出?帐户统计信息中是否有多行具有相同的帐户id和不同的加载日期值?能否在SqlFiddle?Msg 8120第16级第1状态第4行列“accn_payments.accn_ID”中的任意位置显示示例数据和预期输出在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中。Msg 207,级别16,状态1,第2行列名“SumPaidAmount”无效。我根据错误msgs编辑了您的查询:选择sump.SumPaidAmt作为SumPaidAmount,选择sump.SumCoPay作为SumCoPay,选择p.pmt_日期,选择d.load_日期,选择账户ID中的p.ACCN_ID,选择p.pmt_日期,选择sumpaidam_金额作为SumPaidAmt,sumcopay\u金额作为来自账户付款的sumcopay p,其中p.POSTED='Y'和p.pmt\u日期在'20120701'和'20120731'之间,按账户ID、p.pmt\u日期p联接选择不同的加载日期、账户ID和账户人口统计
d on p.ACCN_ID=d.ACCN_ID按p.pmt_日期分组,d.load_日期分组,p.ACCN_ID按3描述排序,仍然得到相同的结果oops非常抱歉格式化添加到组中应修复该问题。您正在按加载日期和第一个子查询中用于聚合的字段进行分组。我不知道复制可能发生在哪里。您能用数据示例和所需的正确结果修改您的问题吗?Msg 8120,16级,状态1,第4行列“accn_payments.accn_ID”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。Msg 207,级别16,状态1,第2行列名“SumPaidAmount”无效。我根据错误msgs编辑了您的查询:选择sump.SumPaidAmt作为SumPaidAmount,选择sump.SumCoPay作为SumCoPay,选择p.pmt_日期,选择d.load_日期,选择账户ID中的p.ACCN_ID,选择p.pmt_日期,选择sumpaidam_金额作为SumPaidAmt,sumcopay\u Amount as sumcopay from accn\u payments p其中p.POSTED='Y'和p.pmt\u date在'20120701'和'20120731'之间,按账户ID分组,p.pmt\u date p join按账户ID分组,p.pmt\u date p join选择不同的加载日期,p.accn\u ID=d.accn\u ID根据p.pmt\u日期分组,d.load\u date,p、 ACCN_ID order by 3 DESC仍然得到相同的结果oops非常抱歉格式化添加到group by应该可以解决此问题。您正在按加载日期和第一个子查询中用于聚合的字段进行分组。我不知道复制可能发生在哪里。你能用一个数据示例和你想要的正确结果来修改你的问题吗?很好的解释。但分组标准是按加载日期。这些在最终结果中仍然是单独的记录。您的帐户付款表中是否可能存在特定帐户id的重复付款日期?按帐户id从帐户付款组中选择帐户id、付款日期、计数*的输出是什么?付款日期的计数*大于1?很好的解释。但分组标准是按加载日期。这些在最终结果中仍然是单独的记录。您的帐户付款表中是否可能存在特定帐户id的重复付款日期?按帐户id、付款日期计数*>1从帐户付款组中选择帐户id、付款日期、计数*的输出是什么?