SQL Server表计算

Mar*_*arc 1 sql sql-server

鉴于:

+-----------+---------------+-------------+-------+
|   Name    |   Item        | Year        | Value |
+-----------+---------------+-------------+-------+
| Company A | Sales         | 2017        |   100 |
| Company A | Sales         | 2016        |   100 |
| Company A | Sales         | 2015        |   400 |
| Company A | Profit        | 2017        |    50 |
| Company A | Profit        | 2016        |    50 |
| Company A | Profit        | 2015        |   200 |
| Company B | Sales         | 2017        |   200 |
| Company B | Sales         | 2016        |   100 |
| Company B | Profit        | 2017        |    20 |
| Company B | Profit        | 2016        |    20 |
+-----------+---------------+-------------+-------+
Run Code Online (Sandbox Code Playgroud)

如何使用SQL将其转换为:

+----------+---------------+--------+-----------+
|   Name   |   Year        | Margins| 2 yr Ave  |
+----------+---------------+--------+-----------+
| CompanyA | 2015          |    50% |    NULL   |  
| CompanyA | 2016          |    50% |    50%    |  
| CompanyA | 2017          |    50% |    50%    |  
| CompanyB | 2016          |    20% |    NULL   |
| CompanyB | 2017          |    10% |    15%    |
+----------+---------------+--------+-----------+
Run Code Online (Sandbox Code Playgroud)

+----------+---------------+--------+-----------+
|   Name   |   Year        | CompA  | CompB     |
+----------+---------------+--------+-----------+
| Margin   | 2015          |    50% |    NULL   |  
| Margin   | 2016          |    50% |    20%    |  
| Margin   | 2017          |    50% |    10%    |  
| 2Yr Ave  | 2015          |   NULL |    NULL   |
| 2Yr Ave  | 2016          |    50% |    NULL   |
| 2Yr Ave  | 2017          |    50% |    15%    |
+----------+---------------+--------+-----------+
Run Code Online (Sandbox Code Playgroud)
  • 保证金:(特定年份的利润/销售额*100)和
  • 2年大道:NULL如果没有上一年的数据,今年的保证金+上一年的保证金/ 2 .

Tim*_*sen 6

我的方法是首先在您的桌子上汇总一次,GROUP BY以计算每年每家公司的利润率.然后,使用第二遍LAG()来计算最近两年的保证金平均值.

WITH cte AS (
    SELECT
        Name,
        Year,
        100*MAX(CASE WHEN Item = 'Profit' THEN Value END) /
            MAX(CASE WHEN Item = 'Sales' THEN Value END) AS Margins
    FROM yourTable
    GROUP BY
        Name,
        Year
)

SELECT
    Name,
    Year,
    Margins,
    (Margins + LAG(Margins) OVER (PARTITION BY Name ORDER BY Year)) / 2 AS [2 yr Avg]
FROM cte
ORDER BY
    Name,
    Year
Run Code Online (Sandbox Code Playgroud)

对于第二个表输出,您可以从此查询中转动结果.将我给你的代码放入CTE,然后在边距列上转动.

输出:

在此输入图像描述

在这里演示:

Rextester