简体   繁体   中英

Get Total Number of Records after Distinct SQL Server

I have a query that is joined to 3 tables. Without "DISTINCT" the total records is 331 but with Distinct the total number is 113. I want to get the 113 total only which is the total of distinct records. I used Count but it gives me the total number of not unique records. Please help me get the total of distinct records. Here's my query.

Without distinct (331 records)

SELECT  
uf.OrigFileName,
uf.CreatedOn,
sdiTran.Status,
sdiFS.FileName,
sdiFile.ArchiveLogID,
COUNT(*) over() as totalRows
FROM [SDI].dbo.UploadedFile uf 
inner join [SDI].dbo.SDIFile sdiFile on uf.UploadedFullFileName = sdiFile.OriginalName 
left join [SDI].dbo.SDITransaction sdiTran on sdiFile.ID = sdiTran.SDIFileID 
inner join [SDI].dbo.SDIFSArchive sdiFS on sdiFile.ID = sdiFS.SDIFileID
WHERE uf.CommunityID = '7cc67de8-e5c2-4055-958b-f604c6a40cf1' 
AND uf.OrganizationID='e5750df1-0409-46b6-9aba-7f07be7c890c'

在此处输入图片说明

After Distinct (113 records). totalRows should be 113 only since what I'm getting are distinct records.

SELECT distinct
uf.OrigFileName,
uf.CreatedOn,
sdiTran.Status,
sdiFS.FileName,
sdiFile.ArchiveLogID,
COUNT(*) over() as totalRows
FROM [SDI].dbo.UploadedFile uf 
inner join [SDI].dbo.SDIFile sdiFile on uf.UploadedFullFileName = sdiFile.OriginalName 
left join [SDI].dbo.SDITransaction sdiTran on sdiFile.ID = sdiTran.SDIFileID 
inner join [SDI].dbo.SDIFSArchive sdiFS on sdiFile.ID = sdiFS.SDIFileID
WHERE uf.CommunityID = '7cc67de8-e5c2-4055-958b-f604c6a40cf1' 
AND uf.OrganizationID='e5750df1-0409-46b6-9aba-7f07be7c890c'

在此处输入图片说明

You can use the distinct in a sub query:

SELECT *
    , COUNT(*) over() as totalRows
FROM (
    SELECT DISTINCT
    uf.OrigFileName,
    uf.CreatedOn,
    sdiTran.Status,
    sdiFS.FileName,
    sdiFile.ArchiveLogID
    FROM [SDI].dbo.UploadedFile uf 
    inner join [SDI].dbo.SDIFile sdiFile on uf.UploadedFullFileName = sdiFile.OriginalName 
    left join [SDI].dbo.SDITransaction sdiTran on sdiFile.ID = sdiTran.SDIFileID 
    inner join [SDI].dbo.SDIFSArchive sdiFS on sdiFile.ID = sdiFS.SDIFileID
    WHERE uf.CommunityID = '7cc67de8-e5c2-4055-958b-f604c6a40cf1' 
    AND uf.OrganizationID='e5750df1-0409-46b6-9aba-7f07be7c890c'
) A

If you want 331 rows with the count of 113 in each row, you can use a trick. Use row_number() to enumerate the rows with the same values and then use a window function to count when the number is 1:

SELECT t.*,
       SUM(CASE WHEN seqnum = 1 THEN 1 ELSE 0 END) OVER () as CountDistinct
FROM (SELECT uf.OrigFileName, uf.CreatedOn, sdiTran.Status, sdiFS.FileName, 
             sdiFile.ArchiveLogID,
             ROW_NUMBER() OVER (PARTITION BY uf.OrigFileName, uf.CreatedOn, sdiTran.Status, sdiFS.FileName, sdiFile.ArchiveLogID
                              ORDER BY (SELECT NULL)) as seqnum
      FROM [SDI].dbo.UploadedFile uf inner join
           [SDI].dbo.SDIFile sdiFile
           on uf.UploadedFullFileName = sdiFile.OriginalName left join
           [SDI].dbo.SDITransaction sdiTran
           on sdiFile.ID = sdiTran.SDIFileID inner join
           [SDI].dbo.SDIFSArchive sdiFS on sdiFile.ID = sdiFS.SDIFileID
      WHERE uf.CommunityID = '7cc67de8-e5c2-4055-958b-f604c6a40cf1' AND
            uf.OrganizationID='e5750df1-0409-46b6-9aba-7f07be7c890c'
     ) t;

If you only want the count of the distinct records, you can use COUNT(DISTINCT) . Because SQL Server doesn't allow multiple arguments, a subquery is perhaps the simplest method:

SELECT COUNT(*)
FROM (SELECT DISTINCT uf.OrigFileName, uf.CreatedOn, sdiTran.Status, sdiFS.FileName, 
             sdiFile.ArchiveLogID
      FROM [SDI].dbo.UploadedFile uf inner join
           [SDI].dbo.SDIFile sdiFile
           on uf.UploadedFullFileName = sdiFile.OriginalName left join
           [SDI].dbo.SDITransaction sdiTran
           on sdiFile.ID = sdiTran.SDIFileID inner join
           [SDI].dbo.SDIFSArchive sdiFS on sdiFile.ID = sdiFS.SDIFileID
      WHERE uf.CommunityID = '7cc67de8-e5c2-4055-958b-f604c6a40cf1' AND
            uf.OrganizationID='e5750df1-0409-46b6-9aba-7f07be7c890c'
     ) t;
  1. Use distinct in count() function with unique column,like select count(DISTINCT columnName) as count .and don't use over() clause while getting count with distinct.

      -

List item

SELECT  
uf.OrigFileName ,
uf.CreatedOn,
sdiTran.Status,
sdiFS.FileName,
sdiFile.ArchiveLogID,
COUNT(DISTINCT uf.OrigFileName) as totalRows
FROM [SDI].dbo.UploadedFile uf 
inner join [SDI].dbo.SDIFile sdiFile on uf.UploadedFullFileName = sdiFile.OriginalName 
left join [SDI].dbo.SDITransaction sdiTran on sdiFile.ID = sdiTran.SDIFileID 
inner join [SDI].dbo.SDIFSArchive sdiFS on sdiFile.ID = sdiFS.SDIFileID
WHERE uf.CommunityID = '7cc67de8-e5c2-4055-958b-f604c6a40cf1' 
AND uf.OrganizationID='e5750df1-0409-46b6-9aba-7f07be7c890c'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM