存在多个记录时对特定列求和

时间:2017-01-25 20:08:27

标签: tsql aggregate-functions sql-server-2014

我试图将特定列相加以获得每个ID的总数 - 但我的结果集返回的结果集是6的倍数。

例如,我的查询中的request_ID有六个与之关联的docket_ID,每个docket_ID都有六个message_document_IDs关联。

查询:

SELECT r.id,
r.number_of_documents,
rc.docket_id,
rc.sequence_no,
rc.case_number_from_filer,
rd.number_of_pages,
rd.message_document_id,
r.received_date
FROM dbo.requests AS [r]
INNER JOIN dbo.request_court_documents_additonal_information AS [rc]
    ON r.id = rc.request_id
INNER JOIN dbo.request_document_additonal_information AS [rd]
    ON rd.request_id = r.id
WHERE CAST(r.received_date AS DATE) >= '10/1/2015'
  AND CAST(r.received_date AS DATE) <= '9/30/2016'
  AND rc.case_number_from_filer = 'NEW CASE'
  AND r.id = 32700637
ORDER BY r.id,
rc.docket_id,
rd.message_document_id;

数据集如下:

id        docket_id  case_number  nbr_of_pgs  msg_doc_id  received_date
32700637  197085524  NEW CASE     18          DOC00001    2015-10-01 00:01:32.590
32700637  197085524  NEW CASE     1           DOC00002    2015-10-01 00:01:32.590
32700637  197085524  NEW CASE     4           DOC00003    2015-10-01 00:01:32.590
32700637  197085524  NEW CASE     9           DOC00004    2015-10-01 00:01:32.590
32700637  197085524  NEW CASE     9           DOC00005    2015-10-01 00:01:32.590
32700637  197085524  NEW CASE     3           DOC00006    2015-10-01 00:01:32.590
32700637  197085906  NEW CASE     18          DOC00001    2015-10-01 00:01:32.590
32700637  197085906  NEW CASE     1           DOC00002    2015-10-01 00:01:32.590
32700637  197085906  NEW CASE     4           DOC00003    2015-10-01 00:01:32.590
32700637  197085906  NEW CASE     9           DOC00004    2015-10-01 00:01:32.590
32700637  197085906  NEW CASE     9           DOC00005    2015-10-01 00:01:32.590
32700637  197085906  NEW CASE     3           DOC00006    2015-10-01 00:01:32.590
32700637  197085941  NEW CASE     18          DOC00001    2015-10-01 00:01:32.590
32700637  197085941  NEW CASE     1           DOC00002    2015-10-01 00:01:32.590
32700637  197085941  NEW CASE     4           DOC00003    2015-10-01 00:01:32.590
32700637  197085941  NEW CASE     9           DOC00004    2015-10-01 00:01:32.590
32700637  197085941  NEW CASE     9           DOC00005    2015-10-01 00:01:32.590
32700637  197085941  NEW CASE     3           DOC00006    2015-10-01 00:01:32.590

这又重复了三次 - 所以我返回36行数据,当我尝试SUM(rd.number_of_pages)时 - 我的结果是我期望的6倍:264当它应该是44。

SELECT r.id,
SUM(rd.number_of_pages) AS [Pages]
FROM dbo.requests AS [r]
INNER JOIN dbo.request_court_documents_additonal_information AS [rc]
    ON r.id = rc.request_id
INNER JOIN dbo.request_document_additonal_information AS [rd]
    ON rd.request_id = r.id
WHERE CAST(r.received_date AS DATE) >= '10/1/2015'
  AND CAST(r.received_date AS DATE) <= '9/30/2016'
  AND rc.case_number_from_filer = 'NEW CASE'
  AND r.id = 32700637
GROUP BY r.id;

如何从docket_ids中删除重复值以返回记录的真实总和?

谢谢,

1 个答案:

答案 0 :(得分:1)

这是一种相关子查询的方式

if object_id('tempdb..#t') is not null drop table #t

create table #t (id int, docket_id int, case_number varchar(64), nbr_of_pgs int, msg_doc_id varchar(64), received_date datetime)
insert into #t values
(32700637,197085524,'NEW CASE',18,'DOC00001','2015-10-01 00:01:32.590'),
(32700637,197085524,'NEW CASE',1,'DOC00002','2015-10-01 00:01:32.590'),
(32700637,197085524,'NEW CASE',4,'DOC00003','2015-10-01 00:01:32.590'),
(32700637,197085524,'NEW CASE',9,'DOC00004','2015-10-01 00:01:32.590'),
(32700637,197085524,'NEW CASE',9,'DOC00005','2015-10-01 00:01:32.590'),
(32700637,197085524,'NEW CASE',3,'DOC00006','2015-10-01 00:01:32.590'),
(32700637,197085906,'NEW CASE',18,'DOC00001','2015-10-01 00:01:32.590'),
(32700637,197085906,'NEW CASE',1,'DOC00002','2015-10-01 00:01:32.590'),
(32700637,197085906,'NEW CASE',4,'DOC00003','2015-10-01 00:01:32.590'),
(32700637,197085906,'NEW CASE',9,'DOC00004','2015-10-01 00:01:32.590'),
(32700637,197085906,'NEW CASE',9,'DOC00005','2015-10-01 00:01:32.590'),
(32700637,197085906,'NEW CASE',3,'DOC00006','2015-10-01 00:01:32.590'),
(32700637,197085941,'NEW CASE',18,'DOC00001','2015-10-01 00:01:32.590'),
(32700637,197085941,'NEW CASE',1,'DOC00002','2015-10-01 00:01:32.590'),
(32700637,197085941,'NEW CASE',4,'DOC00003','2015-10-01 00:01:32.590'),
(32700637,197085941,'NEW CASE',9,'DOC00004','2015-10-01 00:01:32.590'),
(32700637,197085941,'NEW CASE',9,'DOC00005','2015-10-01 00:01:32.590'),
(32700637,197085941,'NEW CASE',3,'DOC00006','2015-10-01 00:01:32.590')

select distinct id, ct as TotalNum 
from(
    select distinct
        id,
        docket_id,
        sum(nbr_of_pgs) as ct
    from 
        #t
    group by
        id, docket_id)x

您的查询

select distinct id, pages
from(
    SELECT 
        r.id,
        rc.docket_id,
        SUM(rd.number_of_pages) AS [Pages]
    FROM dbo.requests AS [r]
    INNER JOIN dbo.request_court_documents_additonal_information AS [rc]
        ON r.id = rc.request_id
    INNER JOIN dbo.request_document_additonal_information AS [rd]
        ON rd.request_id = r.id
    WHERE CAST(r.received_date AS DATE) >= '10/1/2015'
      AND CAST(r.received_date AS DATE) <= '9/30/2016'
      AND rc.case_number_from_filer = 'NEW CASE'
      AND r.id = 32700637
    GROUP BY r.id, rc.docket_id) x