Sql Server中列值的总计数

时间:2017-08-11 09:34:12

标签: sql-server

两张桌子, TableA和TableB with column" filename"两个表中的值相同。

只有数据的出现次数不同。

e.g

|###TableA#########| 

|id|filename_TableA|
|01|file1          |
|02|file1          |
|03|file2          |
|04|file2          |
|05|file3          |
|06|file4          |

|## TableB ########|

|id|filename_TableB|
|01|file1          |
|02|file1          |
|03|file1          |
|04|file2          |
|05|file2          |
|06|file3          |
|07|file3          |
|08|file4          |
|09|file4          |

我需要生成一个SQL查询,用

显示不同的文件名

不同文件名的计数和总计数。

像这样: enter image description here

使用select count(distinct filename_TableA) as totalCount from TableA 给出文件名的totalCount,但是我无法为上面的结果输出生成sql查询。

尝试单桌:

select 
filename_TableA,
count(filename_TableA)as filecount_TableA,
totalCount = (
                select count(distinct filename_TableA) from TableA
             )
from TableA
group by filename_TableA

1 个答案:

答案 0 :(得分:1)

始终尝试将您的问题分解为更小的部分!

您的问题由两部分组成:

  1. 从tableA获取不同的文件和计数
  2. 从tableB获取不同的文件和计数
  3. 我们写查询:

    1

    SELECT filename_TableA, COUNT( * ) AS filecount_TableA
    FROM TableA
    GROUP BY filename_TableA
    

    2

    SELECT filename_TableB, COUNT( * ) AS filecount_TableB
    FROM TableB
    GROUP BY filename_TableB
    

    检查每个查询的结果是否正确。

    然后我们结合查询:

    SELECT filename_TableA, filename_TableB, filecount_TableA, filecount_TableB, ISNULL( filecount_TableA, 0 ) + ISNULL( filecount_TableB, 0 ) AS totalCount,
        COUNT(*) OVER() AS UniqueFileCount
    FROM
            ( SELECT filename_TableA, COUNT( * ) AS filecount_TableA
            FROM TableA
            GROUP BY filename_TableA ) AS A
        FULL OUTER JOIN
                ( SELECT filename_TableB, COUNT( * ) AS filecount_TableB
                FROM TableB
                GROUP BY filename_TableB ) AS B
            ON A.filename_TableA = filename_TableB
    

    注意:要涵盖文件名可能出现在一个表中而不出现在另一个表中的情况,我使用了FULL OUTER JOIN。 如果您没有这样的场景,即每个表中至少出现一次文件名,那么您应该使用INNER JOIN,因为它会更快。