【问题标题】:Pivot table without null不带空值的数据透视表
【发布时间】:2020-01-11 01:44:10
【问题描述】:

我有下表

+-----+-------+------+---------+
| ID  | NAME  | SORT |  AMOUNT |
+-----+-------+------+---------+
|   1 | sak   | A    |     200 |
|   2 | mods  | b    |     200 |
|   3 | wef   | c    |     200 |
|   4 | sak   | b    |     300 |
|   5 | mods  | a    |     210 |
+-----+-------+------+---------+

我写了以下代码:


SELECT ID,A, B, C 
FROM 
(
Select ID,SORT,
 'SORT'+
      cast(row_number() over(partition by ID order by ID)
             as varchar(10)) Col
from TABLE
) Temp 
pivot 
(
max (SORT)
for Col in ( A, B, C  )
)piv

我得到了这个结果:

+----+------+------+------+
| ID |  A   |  B   |  C   |
+----+------+------+------+
|  1 | NULL | NULL | NULL |
|  2 | NULL | NULL | NULL |
|  3 | NULL | NULL | NULL |
|  4 | NULL | NULL | NULL |
|  5 | NULL | NULL | NULL |
+----+------+------+------+

但需要以这种方式显示表格,但我得到的是 NULL 而不是数量。

【问题讨论】:

  • MySQL 不支持PIVOT。您实际使用的是哪个数据库?
  • 我使用的是sql server
  • 好吧 - 我删除了 mysqli 标签。

标签: sql sql-server tsql group-by pivot


【解决方案1】:

我了解您希望每个 sak 有一条记录,amount 用于列中的 abc

这是一个跨数据库解决方案,它使用条件聚合将数据集旋转到固定列列表:

select 
    sak,
    max(case when upper(sort) = 'A' then amount end) a,
    max(case when upper(sort) = 'B' then amount end) b,
    max(case when upper(sort) = 'C' then amount end) c
from mytable
group by sak
order by sak

【讨论】:

  • 感谢@GMB,这是一个很好的解决方案,对我来说很好,但我需要使用数据透视函数来完成它,因为我试图理解它。你能帮我用枢轴做吗?
  • @RAZ。 . .最好理解条件聚合——这是标准 SQL——而不是像 pivot 这样的定制结构。
【解决方案2】:

您也可以尝试以下方法:

  1. 根据您的结构
SELECT ID, A, B, C
FROM
(
Select ID,UPPER(SORT) SORT,AMOUNT
from MYTABLE
) Temp
pivot
(
max (AMOUNT)
for SORT in (A, B, C)
)piv
ORDER BY 1
  1. 预期
SELECT NAME, A, B, C
FROM
(
SELECT NAME, SORT, AMOUNT
FROM MYTABLE
)T
PIVOT
(
SUM(AMOUNT) FOR SORT IN (A, B, C)
)PVT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2012-07-13
    相关资源
    最近更新 更多