3

私は2つのテーブルを持っています。私が持っているオフィスのリストと、オフィスに分配する収入のリストです。

create table #Income(City varchar(50),Office varchar(50),YearsBudget money)
insert #Income
select 'London', null,     5000 UNION
select 'Paris',  null,     6000 UNION
select null,    'Sales',   7000 UNION
select 'London','Support',10000

create table #Offices(City varchar(50),Office varchar(50),Ratio float)
insert #Offices
select 'London','Research Lab'     ,.15 UNION
select 'London','Customer Services',.45 UNION
select 'London','Sales'            ,.05 UNION
select 'London','Admin'            ,.19 UNION
select 'London','Support'          ,.17 UNION
select 'Paris' ,'Sales'            ,.15 UNION
select 'Paris' ,'Admin'            ,.45 UNION
select 'Paris' ,'Support'          ,.05 UNION
select 'Madrid','Sales'            ,.45 UNION
select 'Madrid','Research Lab'     ,.25 

たとえば、#Income のデータの 1 行には、既知のすべてのロンドン オフィスに配分する必要がある 5000 ポンドがあり、別の行には、既知のすべてのパリ オフィスに配分する必要がある 6000 ポンドがあります。

これは、次の SQL で実現できます。

select o.City,o.Office, convert(money,i.YearsBudget/DATA.RSum*o.Ratio) as ThisYearsBudget
from #Income as i
Left Join #Offices as O
on i.City=o.City
Left join (select child.City,SUM(child.Ratio) as RSum from #Offices as child group by child.City ) DATA
ON i.city=DATA.City 
where i.Office is null

すべての営業所に £7000 を配分し、ロンドン サポート オフィスに £10000 を配分するには、さらに 2 つの select ステートメントと、3 つの配分ビューの結果を合計してグループ化するためのさらに別の select ステートメントが必要です。1 つの単純なビューでこれを達成できますか?

4

1 に答える 1

1

サンプルデータ:

create table Income(City varchar(50),Office varchar(50),YearsBudget money)
insert Income
select 'London', null,     5000 UNION
select 'Paris',  null,     6000 UNION
select null,    'Sales',   7000 UNION
select 'London','Support',10000;

create table Offices(City varchar(50),Office varchar(50),Ratio float)
insert Offices
select 'London','Research Lab'     ,.15 UNION
select 'London','Customer Services',.45 UNION
select 'London','Sales'            ,.05 UNION
select 'London','Admin'            ,.19 UNION
select 'London','Support'          ,.17 UNION
select 'Paris' ,'Sales'            ,.15 UNION
select 'Paris' ,'Admin'            ,.45 UNION
select 'Paris' ,'Support'          ,.05 UNION
select 'Madrid','Sales'            ,.45 UNION
select 'Madrid','Research Lab'     ,.25;

クエリ:

   select o.City,
          o.Office,
          ThisYearsBudget = SUM(convert(money,sq.YearsBudget*o.Ratio/sq.totalratio))
     from Offices o
     join (
          select i.city, i.office, i.yearsbudget, totalratio = sum(o.ratio)
            from income i
            join offices o on isnull(i.city,o.city)=o.city
                          and isnull(i.office,o.office)=o.office
        group by i.city, i.office, i.yearsbudget
          ) sq on isnull(sq.city,o.city)=o.city
              and isnull(sq.office,o.office)=o.office
 group by grouping sets ((o.City, o.Office)
                         --,() -- uncomment this line to see grand total
                        )
 order by City, Office;

結果

|   CITY |            OFFICE | THISYEARSBUDGET |
------------------------------------------------
| London |             Admin |        940.5941 |
| London | Customer Services |       2227.7228 |
| London |      Research Lab |        742.5743 |
| London |             Sales |        785.9863 |
| London |           Support |      10841.5842 |
| Madrid |             Sales |       4846.1538 |
|  Paris |             Admin |       4153.8462 |
|  Paris |             Sales |            3000 |
|  Paris |           Support |        461.5385 |

SQL フィドルのデモ

于 2013-05-10T09:31:37.560 に答える