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;
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.
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.