0

パラメータを使用せずに以下のクエリを実行する方法を見つけることができませんでした。データベースには 2000 を超えるパラメーターの可能な値があるため、すべてのパラメーターを 1 つの列にリストし、クエリからの出力をもう 1 つの列にリストするテーブルを出力する必要があります。以下は、現在機能するものの簡略化されたバージョンです。

SELECT [enter name] AS ExclName, 
       Sum(revenue) AS MaxRev 
FROM   tbltasks 
WHERE  tbltasks.task IN (SELECT DISTINCT tblabilities.task 
                         FROM   tblabilities 
                         WHERE  tblabilities.name <> [enter name]); 

    tbltasks                tblpeople       tblabilities            
    task    revenue         name            name    task                
    A       10              Bob             Bob     A    
    B       9               Tom             Tom     A    
    C       8               Jack            Jack    A    
    D       7               Mary            Tom     B    
    E       6               Diane           Jack    B    
    F       5               Alice           Mary    B    
    G       4               Sam             Jack    C    
    H       3                               Mary    C    
    I       2                               Diane   C    
                                            Mary    D    
                                            Diane   D    
                                            Alice   D    
                                            Diane   E    
                                            Alice   E    
                                            Sam     E    
                                            Bob     F    
                                            Tom     G    
                                            Alice   H   

現在、クエリを実行し、プロンプトが表示されたら「Bob」などの名前を手動で入力し、次のような 1 行の出力を取得します。

ExclName   MaxRev
Bob         47

しかし、私が欲しいのは完全なテーブルです:

ExclName   MaxRev
Bob         47
Tom         48
Jack        52
Mary        52
Diane       52
Alice       49
Sam         52

つまり、指定されたメンバーを除外したチームが達成できる最大の収益を知りたい. 他のグループが関係しているため、実際のアプリケーションはより複雑です (たとえば、Jack を除外する場合、Mary も除外する必要があります) が、上記の単純な問題を解決すれば、残りを処理できると思います。

tblPeople の名前を使用して、それらを単一のクエリで MaxRev 計算にリンクする方法が必要だと考え続けていますが、それを理解することはできませんでした。すべてのパラメーターをループするコードを実行することもできますが、より簡単な解決策があることを願っています。誰の入力にも感謝します。

4

1 に答える 1

0

すべての人に対してクエリを拡張するだけです。

select
   p.name as ExclName, 
   sum(t.revenue) as MaxRev 
from tblpeople as p
    cross join tbltasks as t
where
    t.task in
    (
       select l.task 
       from tblabilities as l
       where l.name <> p.name
    )
group by p.name

sql fiddle demo

更新します。どの RDBMS を使用しているかはまだわかりません。これが SQL Server ソリューションです。パフォーマンスを向上させるために、以下のソリューションを一時テーブル、変数、およびクエリに分割することは可能ですが、とにかく最初のものよりも高速になるはずです (テーブル):

with cte as (
    select l.[name], sum(t.[revenue]) as [revenue]
    from tblabilities as l
        inner join tbltasks as t on t.[task] = l.[task]
    where
        not exists
        (
            select * 
            from tblabilities as tl
            where tl.[task] = l.[task] and tl.[name] <> l.[name]
        )
    group by l.[name]
)
select
    p.[name] as ExclName,
    t.revenue_total - isnull(c.[revenue], 0) as MaxRev
from tblpeople as p
    left outer join cte as c on c.[name] = p.[name]
    outer apply (
        select sum(tt.[revenue]) as revenue_total
        from tbltasks as tt
        where
            tt.[task] in (select tl.[task] from tblabilities as tl)
    ) as t
order by p.[name]

sql fiddle demo

于 2013-08-31T19:09:30.760 に答える