【问题标题】:How to unpivot and get a sum for each month + total?如何取消透视并获得每个月的总和+总计?
【发布时间】:2016-12-12 10:04:38
【问题描述】:

- 已编辑-

我的表中有一些员工数据,每个 idnamehead 都有 sal(薪水)和 -

+----+------+-------+-------+------+
| id | name | head  | month | sal  |
+----+------+-------+-------+------+
| 1  | A    | basic | jan   | 1000 |
+----+------+-------+-------+------+
| 1  | A    | hra   | jan   | 500  |
+----+------+-------+-------+------+
| 1  | A    | basic | feb   | 1000 |
+----+------+-------+-------+------+
| 1  | A    | hra   | feb   | 500  |
+----+------+-------+-------+------+
| 1  | A    | basic | mar   | 1000 |
+----+------+-------+-------+------+
| 1  | A    | hra   | mar   | 500  |
+----+------+-------+-------+------+
| 1  | A    | basic | apr   | 1000 |
+----+------+-------+-------+------+
| 1  | A    | hra   | apr   | 500  |
+----+------+-------+-------+------+
| 1  | A    | basic | may   | 1000 |
+----+------+-------+-------+------+
| 1  | A    | hra   | may   | 500  |
+----+------+-------+-------+------+
| 1  | A    | basic | june  | 1000 |
+----+------+-------+-------+------+
| 1  | A    | hra   | june  | 500  |
+----+------+-------+-------+------+
| 1  | A    | basic | july  | 1000 |
+----+------+-------+-------+------+
| 1  | A    | hra   | july  | 500  |
+----+------+-------+-------+------+
| 1  | A    | basic | aug   | 1000 |
+----+------+-------+-------+------+
| 1  | A    | hra   | aug   | 500  |
+----+------+-------+-------+------+
| 1  | A    | basic | sep   | 1000 |
+----+------+-------+-------+------+
| 1  | A    | hra   | sep   | 500  |
+----+------+-------+-------+------+
| 1  | A    | basic | oct   | 1000 |
+----+------+-------+-------+------+
| 1  | A    | hra   | oct   | 500  |
+----+------+-------+-------+------+
| 1  | A    | basic | nov   | 1000 |
+----+------+-------+-------+------+
| 1  | A    | hra   | nov   | 500  |
+----+------+-------+-------+------+
| 1  | A    | basic | dec   | 1000 |
+----+------+-------+-------+------+
| 1  | A    | hra   | dec   | 500  |
+----+------+-------+-------+------+
|    |      |       |       |      |
+----+------+-------+-------+------+
| 2  | B    | basic | mar   | 2000 |
+----+------+-------+-------+------+
| 2  | B    | hra   | mar   | 500  |
+----+------+-------+-------+------+
| 2  | B    | basic | apr   | 2000 |
+----+------+-------+-------+------+
| 2  | B    | hra   | apr   | 500  |
+----+------+-------+-------+------+
| 2  | B    | basic | may   | 2000 |
+----+------+-------+-------+------+
| 2  | B    | hra   | may   | 500  |
+----+------+-------+-------+------+
| 2  | B    | basic | june  | 2000 |
+----+------+-------+-------+------+
| 2  | B    | hra   | june  | 500  |
+----+------+-------+-------+------+
| 2  | B    | basic | july  | 2000 |
+----+------+-------+-------+------+
| 2  | B    | hra   | july  | 500  |
+----+------+-------+-------+------+
| 2  | B    | basic | aug   | 2000 |
+----+------+-------+-------+------+
| 2  | B    | hra   | aug   | 500  |
+----+------+-------+-------+------+
| 2  | B    | basic | sep   | 2000 |
+----+------+-------+-------+------+
| 2  | B    | hra   | sep   | 500  |
+----+------+-------+-------+------+
| 2  | B    | basic | oct   | 2000 |
+----+------+-------+-------+------+
| 2  | B    | hra   | oct   | 500  |
+----+------+-------+-------+------+
| 2  | B    | basic | nov   | 2000 |
+----+------+-------+-------+------+
| 2  | B    | hra   | nov   | 500  |
+----+------+-------+-------+------+
| 2  | B    | basic | dec   | 2000 |
+----+------+-------+-------+------+
| 2  | B    | hra   | dec   | 500  |
+----+------+-------+-------+------+
|    |      |       |       |      |
+----+------+-------+-------+------+
| 3  | C    | basic | jan   | 5000 |
+----+------+-------+-------+------+
| 3  | C    | hra   | jan   | 500  |
+----+------+-------+-------+------+
| 3  | C    | basic | feb   | 5000 |
+----+------+-------+-------+------+
| 3  | C    | hra   | feb   | 500  |
+----+------+-------+-------+------+
| 3  | C    | basic | mar   | 5000 |
+----+------+-------+-------+------+
| 3  | C    | hra   | mar   | 500  |
+----+------+-------+-------+------+
| 3  | C    | basic | apr   | 5000 |
+----+------+-------+-------+------+
| 3  | C    | hra   | apr   | 500  |
+----+------+-------+-------+------+
| 3  | C    | basic | may   | 5000 |
+----+------+-------+-------+------+
| 3  | C    | hra   | may   | 500  |
+----+------+-------+-------+------+
| 3  | C    | basic | june  | 5000 |
+----+------+-------+-------+------+
| 3  | C    | hra   | june  | 500  |
+----+------+-------+-------+------+
| 3  | C    | basic | july  | 5000 |
+----+------+-------+-------+------+
| 3  | C    | hra   | july  | 500  |
+----+------+-------+-------+------+
| 3  | C    | basic | aug   | 5000 |
+----+------+-------+-------+------+
| 3  | C    | hra   | aug   | 500  |
+----+------+-------+-------+------+
| 3  | C    | basic | sep   | 5000 |
+----+------+-------+-------+------+
| 3  | C    | hra   | sep   | 500  |
+----+------+-------+-------+------+

我正在实现每个 idnamehead
每个月的总和列为 sal + 所有列的总数。
(附言月份显示从四月开始)

+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+
| id | name | head  | apr  | may  | jun  | jul  | aug  | sep  | oct  | nov  | dec  | jan  | feb  | mar  | total |
+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+
| 1  | A    | basic | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 12000 |
+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+
| 1  | A    | hra   | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 6000  |
+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+
| 2  | B    | basic | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 | 0    | 0    | 2000 | 24000 |
+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+
| 2  | B    | hra   | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 0    | 0    | 500  | 6000  |
+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+
| 3  | C    | basic | 5000 | 5000 | 5000 | 5000 | 5000 | 5000 | 0    | 0    | 0    | 5000 | 5000 | 5000 | 60000 |
+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+
| 3  | C    | hra   | 500  | 500  | 500  | 500  | 500  | 500  | 0    | 0    | 0    | 500  | 500  | 500  | 6000  |
+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+

【问题讨论】:

  • 这不是一个问题,它的格式甚至无法接受,而且我们也不是免费的代码编写服务。
  • @RaviKumar 请阅读the tourHow do I ask a good question?
  • 您的一些总计算似乎是错误的(与我的答案比较)

标签: sql sql-server


【解决方案1】:
select      id,name,head
           ,apr,may,june,july,aug,sep,oct,nov,dec,jan,feb,mar
           ,apr+may+june+july+aug+sep+oct+nov+dec+jan+feb+mar   as total

from       (select      id
                       ,name
                       ,head

                       ,coalesce (apr  ,0)    as apr
                       ,coalesce (may  ,0)    as may
                       ,coalesce (june ,0)    as june
                       ,coalesce (july ,0)    as july
                       ,coalesce (aug  ,0)    as aug
                       ,coalesce (sep  ,0)    as sep
                       ,coalesce (oct  ,0)    as oct
                       ,coalesce (nov  ,0)    as nov
                       ,coalesce (dec  ,0)    as dec
                       ,coalesce (jan  ,0)    as jan
                       ,coalesce (feb  ,0)    as feb
                       ,coalesce (mar  ,0)    as mar

            from        mytable pivot (sum(sal) for month in
                            (apr,may,june,july,aug,sep,oct,nov,dec,jan,feb,mar)) p      
            ) p

+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+
| id | name | head  | apr  | may  | jun  | jul  | aug  | sep  | oct  | nov  | dec  | jan  | feb  | mar  | total |
+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+
| 1  | A    | basic | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 12000 |
+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+
| 1  | A    | hra   | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 6000  |
+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+
| 2  | B    | basic | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 | 2000 | 0    | 0    | 2000 | 20000 |
+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+
| 2  | B    | hra   | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 500  | 0    | 0    | 500  | 5000  |
+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+
| 3  | C    | basic | 5000 | 5000 | 5000 | 5000 | 5000 | 5000 | 0    | 0    | 0    | 5000 | 5000 | 5000 | 45000 |
+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+
| 3  | C    | hra   | 500  | 500  | 500  | 500  | 500  | 500  | 0    | 0    | 0    | 500  | 500  | 500  | 4500  |
+----+------+-------+------+------+------+------+------+------+------+------+------+------+------+------+-------+

【讨论】:

  • 当您回答此类问题时,您似乎可以将 SO 用作代码编写服务。
  • @Biffen,这个问题在我看来并不是代码编写服务请求。这似乎更像是语言障碍。它不包含图像。它包含一个很好的文本示例,包括所需的结果(尽管有一些错误)。
  • 拉维你在吗?
猜你喜欢
  • 2021-02-18
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
相关资源
最近更新 更多