鉴于:
+-----------+---------------+-------------+-------+
| 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)
NULL如果没有上一年的数据,今年的保证金+上一年的保证金/ 2 .我的方法是首先在您的桌子上汇总一次,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,然后在边距列上转动.
输出:
在这里演示:
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |