我应该如何组合这些SQL查询:自联接或使用临时表?

时间:2013-01-25 16:20:19

标签: sql self-join temp-tables

我正在创建一个存储过程,从几个不同的表中提取汇总和值。另外,查询对于不同的过滤器来说是简单的。

查询需要连接在一起,如下所示:

select distinct(bus_name), sum(act) as 'totrev', sum(budget) as 'budget rev' 
from finance
where year = '2011' 
and type_desc = 'rev'
group by bus_code, bus_name
order by bus_name asc

select distinct(bus_name), sum(act) as 'totalexp', sum(budget) as 'budget exp' 
from finance
where year = '2011' 
and type_desc = 'exp'
group by bus_code, bus_name
order by bus_name asc

select distinct(bus_name), sum(end_balance) as 'total assets' 
from Balance
where year = '2011' 
and type_desc = 'assets'
group by bus_code, bus_name
order by bus_name asc

select distinct(bus_name), sum(end_balance) as 'Cash' 
from Balance
where year = '2011' 
and type_desc = 'equity'
group by bus_code, bus_name
order by bus_name asc

select bus_code, bus_name, count(bus_code) as '#of bldgs'
from building
group by bus_code, bus_name
order by bus_name asc

我希望合并/加入所有要在一个表中查看的列。 finance_table
columns = bus_code,bus_name,#bldgs,tot_rev,budget_rev,totalexp,budget exp,total assets,cash

2 个答案:

答案 0 :(得分:1)

使用嵌套查询尝试这样的事情:

SELECT T5.bus_code, T5.bus_name, T5.[# of bldgs], T1.tot_rev, T1.budget_rev, T2.totalexp, T2.[budget exp], T3.[total assets], T4.cash
FROM
    (
    select distinct(bus_name), sum(act) as 'totrev', sum(budget) as 'budget rev' 
    from finance
    where year = '2011' 
    and type_desc = 'rev'
    group by bus_code, bus_name
    order by bus_name asc
    ) T1 INNER JOIN
    (
    select distinct(bus_name), sum(act) as 'totalexp', sum(budget) as 'budget exp' 
    from finance
    where year = '2011' 
    and type_desc = 'exp'
    group by bus_code, bus_name
    order by bus_name asc
    ) T2 ON T1.bus_name = T2.bus_name
    INNER JOIN
    (
    select distinct(bus_name), sum(end_balance) as 'total assets' 
    from Balance
    where year = '2011' 
    and type_desc = 'assets'
    group by bus_code, bus_name
    order by bus_name asc
    ) T3 ON T2.bus_name = T3.bus_name
    INNER JOIN
    (
    select distinct(bus_name), sum(end_balance) as 'Cash' 
    from Balance
    where year = '2011' 
    and type_desc = 'equity'
    group by bus_code, bus_name
    order by bus_name asc
    ) T4 ON T3.bus_name = T4.bus_name
    INNER JOIN
    (
    select bus_code, bus_name, count(bus_code) as '#of bldgs'
    from building
    group by bus_code, bus_name
    order by bus_name asc
    ) T5 ON T4.bus_name = T5.bus_name

我假设内部联接,但如果某些内容不具有特定业务的条目,则可能需要使用外部联接。但一般技术都是一样的。

答案 1 :(得分:1)

如果您的SQL支持CASE表达式,您可以使用它们为每种类型创建“虚拟”字段,然后对它们求和。

select bus_code, bus_name
 ,sum(case when type_desc = 'rev' then act else 0 end) as 'totrev'
 ,sum(case when type_desc = 'rev' then budgetelse 0 end) as 'budget rev' 
 ,sum(case when type_desc = 'exp' then act else 0 end) as 'totexp'
 ,sum(case when type_desc = 'exp' then budgetelse 0 end) as 'budget exp' 
 ... ... etc.
from finance
where year = '2011' 
group by bus_code, bus_name
order by bus_name asc

最后(建筑物)表可以简单地连接到这个表,在总线代码

相关问题