SQL Server累积分组

时间:2019-07-04 22:37:14

标签: sql-server

我有一张表格,其中列出了从csv文件导入的文件和文件夹。该表的列主要为FullName(文件或文件夹的路径)和FileExtension

我可以使用以下查询获取所有文件夹的列表以及这些文件夹中相应文件的数量

SELECT
    SUBSTRING(FullName, 0, LEN(FullName) - CHARINDEX('\', REVERSE(FullName)) + 1) AS RootFolder, 
    COUNT(*) AS FileCount
FROM
    FileDump 
WHERE
    NULLIF(FileExtension, '') IS NOT NULL
GROUP BY
    SUBSTRING(FullName, 0, LEN(FullName) - CHARINDEX('\', REVERSE(FullName)) + 1)
ORDER BY
    FileCount DESC

但是我想得到的是,如果文件夹中包含子文件夹,而这些子文件夹中有文件,则任何文件夹的文件数也应包括其下的所有文件

全名的样本数据

C:\Folder1
C:\Folder1\File1.xlsx
C:\Folder1\File2.xlsx
C:\Folder1\Folder2
C:\Folder1\Folder2\file3.xlsx

预期结果

C:\Folder1  - 3
C:\Folder1\Folder2 - 1

1 个答案:

答案 0 :(得分:1)

一种方法是从文件夹开始。
哪些没有扩展名。

然后左键联接文件并在文件夹上分组以对文件计数。

SELECT 
 [folder].FullName AS RootFolder, 
 COUNT([file].FullName) AS FileCount
FROM FileDump AS [folder]
LEFT JOIN FileDump AS [file] 
  ON NULLIF([file].FileExtension, '') IS NOT NULL 
 AND [file].FullName LIKE CONCAT([folder].FullName,'\%')
WHERE NULLIF([folder].FileExtension, '') IS NULL
GROUP BY [folder].FullName
ORDER BY RootFolder;

结果:

RootFolder          FileCount
------------------  ---------
C:\Folder1          3
C:\Folder1\Folder2  1