2013-05-20 54 views
1

如果我有格式的數據;通過多行計算SQL Server

Account | Period  | Values 
Revenue | 2013-01-01 | 5432 
Revenue | 2013-02-01 | 6471 
Revenue | 2013-03-01 | 7231 
Costs | 2013-01-01 | 4321 
Costs | 2013-02-01 | 5672 
Costs | 2013-03-01 | 4562 

而我想要得到的結果像;

Account | Period  | Values 
Margin | 2013-01-01 | 1111 
Margin | 2013-02-01 | 799 
Margin | 2013-03-01 | 2669 
M%  | 2013-01-01 | .20 
M%  | 2013-02-01 | .13 
M%  | 2013-03-01 | .37 

其中保證金=收入 - 成本和M%是(收入 - 成本)/每個期間的收入。

我可以看到實現這一目標的各種方法,但都非常難看,我想知道是否有這種多行計算的優雅通用方法。

感謝

編輯

部分計算,可以得到很複雜喜歡

自由現金流=保證金 - 運營支出 - 資本支出+營運資金變動+已付利息

所以我希望有一種不需要大量連接的通用方法。與聯盟

感謝

+0

的SQL Server版本= 2008 R2 – Davethebfg

回答

1

好,然後就在最大Case語句,像這樣的:

with RevAndCost as (revenue,costs,period) 
as 
(

    select "Revenue" = Max(Case when account="Revenue" then Values else null end), 
      "Costs" = MAX(Case when account="Costs" then values else null end), 
      period 
      from data 
    group by period 

) 

select Margin = revenue-costs, 
     "M%" = (revenue-costs)/nullif(revenue,0) 
from RevAndCost 
+0

這就是我一直在尋找 – Davethebfg

1

使用全自連接

Select 'Margin' Account, 
    coalesce(r.period, c.period) Period, 
    r.Values - c.Values Values 
From myTable r 
    Full Join Mytable c 
     On c.period = r.period 
Union 
Select 'M%' Account, 
    coalesce(r.period, c.period) Period, 
    (r.Values - c.Values)/r.Values Values 
From myTable r 
    Full Join Mytable c 
     On c.period = r.period 
+0

爲什麼不'聯盟所有'? – Kermit

+0

它絕對有效,但每次我想在列中添加另一行時,我都必須添加另一個FULL JOIN。例如。 (使用行,我沒有顯示我需要計算的東西;自由現金流量=保證金 - Opex - 資本支出+流動資金變化+利息支付哪個需要5個完整聯結如果我理解您的查詢正確 – Davethebfg

1

這裏我用一個公共表表達式做了充分的外部數據表的兩個實例之間的連接在收入拉和將成本分成1個表格,然後從該CTE中選擇。

with RevAndCost as (revenue,costs,period) 
as 
(
    select ISNULL(rev.Values,0) as revenue, 
      ISNULL(cost.values,0) as costs, 
     ISNULL(rev.period,cost.period) 
    from data rev full outer join data cost 
    on rev.period=cost.period 
) 

select Margin = revenue-costs, 
    "M%" = (revenue-costs)/nullif(revenue,0) 
from RevAndCost 
+0

再次我喜歡這有沒有一種方法,不需要另一個FULL JOIN我想包括的每一行。 – Davethebfg

1

我會做這樣的:

SELECT r.PERIOD, r.VALUES AS revenue, c.VALUES AS cost, 
r.VALUES - c.VALUES AS margin, (r.VALUES - c.VALUES)/r.VALUES AS mPct 
FROM 
    (SELECT PERIOD, VALUES FROM t WHERE 
    ACCOUNT = 'revenue') r INNER JOIN 
    (SELECT PERIOD, VALUES FROM t WHERE 
    ACCOUNT = 'costs') c ON 
    r.PERIOD = c.PERIOD