0

次のようなフォルダーのリストを含むテーブルがあります。

Path                    Size
C:\ParentFolder\A       123
C:\ParentFolder\A\B     442434
C:\ParentFolder\A\B\C   13413412
C:\ParentFolder\D       2422341234
C:\ParentFolder\D\E     3342
C:\ParentFolder\D\E\F   2
C:\ParentFolder\D\E\G   2
...

SUM、GROUP BY、および PATINDEX/LTRIM/SUBSTRING/etc の組み合わせを探しています。これは私にこれを返すでしょう:

Path                    SumSize
C:\ParentFolder\A       13855969
C:\ParentFolder\D       2422344580
...

C:\ParentFolder は既知のプレフィックスですが、A、D などです。可変フォルダ名です。それを達成するために関数を書く必要がありますか、それとも文字列関数の組み合わせを使用できますか?

4

5 に答える 5

1
select r.Path, sum(Size) as SumSize
from MyTable m
inner join (
    select Path
    from MyTable 
    where charindex('\', Path, len('C:\ParentFolder\') + 1) = 0 
) r on charindex(r.Path, m.Path, 0) = 1
group by r.Path

SQLフィドルの例はこちら

于 2012-06-07T14:13:06.043 に答える
0
 select path, (select sum(Size) 
               from Paths p2 where p2.Path like p1.Path+'%') as total
 from Paths p1
 where charIndex('\',Path, len('C:\ParentFolder\')+1) = 0
于 2012-06-07T14:41:56.433 に答える
0

--フォルダ名が常に1文字の場合

select 
LEFT(folder,CHARINDEX('r\',folder)+2) as folder_group
,SUM(size) as sumsize
from #mytable
GROUP BY
LEFT(folder,CHARINDEX('r\',folder)+2)

-- フォルダ名が可変長の場合

select 
CASE WHEN CHARINDEX('\',folder,CHARINDEX('\',folder,CHARINDEX('\',folder)+1)+1) = 0 THEN folder
    ELSE LEFT(folder,CHARINDEX('\',folder,CHARINDEX('\',folder,CHARINDEX('\',folder)+1)+1) -1) END AS folder_group
,SUM(size) as sumsize
from #mytable
GROUP BY
CASE WHEN CHARINDEX('\',folder,CHARINDEX('\',folder,CHARINDEX('\',folder)+1)+1) = 0 THEN folder
    ELSE LEFT(folder,CHARINDEX('\',folder,CHARINDEX('\',folder,CHARINDEX('\',folder)+1)+1) -1) END 
于 2012-06-07T14:41:57.290 に答える
0

テスト セットから始めて、

CREATE TABLE #MyTable (Folder varchar(100) not null, Size bigint not null)

INSERT #MyTable values
  ('C:\ParentFolder\A'     ,  123)
 ,('C:\ParentFolder\A\B'   ,  442434)
 ,('C:\ParentFolder\A\B\C' ,  13413412)
 ,('C:\ParentFolder\D'     ,  2422341234)
 ,('C:\ParentFolder\D\E'   ,  3342)
 ,('C:\ParentFolder\D\E\F' ,  2)
 ,('C:\ParentFolder\D\E\G' ,  2)

最初に、要約するフォルダーを決定します。ここでは、それらを一時テーブルにロードして行います。

DECLARE @Targets table (Folder varchar(100) not null)
INSERT @Targets values
  ('C:\ParentFolder\A')
 ,('C:\ParentFolder\D')

ここからは、like 句を使用すると簡単です。

SELECT ta.Folder, sum(Size) TotalSize
 from @Targets ta
  left outer join #MyTable mt
   on mt.Folder like ta.Folder + '%'
 group by ta.Folder

like句で使用される予約文字がフォルダに含まれていると、複雑になる可能性があります% _ ] [

于 2012-06-07T14:15:29.380 に答える
0

Assuming that there is always an entry for the highest level dir (i.e if there is a c:\xxx\yyy\zzz there will always be a c:\xxx\yyy how about

;with roots (root) as (
     select distinct
        path + '\' 
     from 
        thetable
     where 
        --only include paths with 2 x \
        len(path) - 2 = len(replace(path, '\', '')) 
)
select
    roots.root,
    sum(thetable.size)
from 
    roots
inner join 
    thetable on left(thetable.path + '\', len(roots.root)) = roots.root 
group by
    roots.root
于 2012-06-07T14:40:06.263 に答える