SQL中行转列
什么是行转列
什么是行转列?首先看一个简单明了的例子:
数据库中存储的数据格式是这样的:
但是想展示的数据是这样的:
上面的例子就是典型的行转列,我们把 name
字段中的每种取值都转换成了一个列来展示,并且将 val
字段的取值作为了转换后新列的取值。
当然,如果您对 SQL 语言比较了解,其实通过 SQL 语句就可以实现这样的行列转换,但是这样的 SQL 语句会变得很复杂,很不利于理解,因此Sugar BI提供了 SQL 模型的行转列功能。
下面就基于以上的简单例子来说明如何使用Sugar BI的行转列功能:
开启行转列
在 SQL 建模时有个开关可以开启,并且需要填入行转列的名称字段和取值字段,如下图建模时,我们不仅对的date
字段做了描述,我们还对行转列之后的新列pv、uv、post
做了描述,但并没有对name
和val
做建模,因为行转列之后就不存在这两个字段了。
特别需要注意的是:行转列时,SQL语句中select的字段需要谨慎填写,Sugar BI目前只允许您select三个字段,即除了名称和取值字段以外,只能额外select一个维度字段,大部分情况下都是日期、时间等。
绑定行转列模型到图表
将模型绑定到图表时与普通的非行转列的模型一样,因为我们已经将数据行转列了,在绑定图表数据时就可以直接使用转换后的各个列了,如下图绑定一个折线图的数据:
通过行转列可以使折线图实现多系列的展示,将转换后的字段绑定到「Y 轴」上,每个字段就是一个系列,效果图如下:
绑定所有的行转列
上面一节中,我们逐列将行转换的新列绑定到了表格中进行展示,然而,在一些情况下有可能有哪些行转换的新列我们都不确定(例如:基于上面的例子,某一天我们新增了一个指标叫做replay
回帖数,此时我们只能修改 SQL 模型新增这样一列并且将它绑定到表格的列中才能展示,这样做很麻烦,而且如果以后又不断的新增指标怎么办?),因此Sugar BI允许用户将所有的行转换的列一键绑定到各图表(表格、折线、柱状、饼图等)。
如下图我们开启了绑定所有行转列,在表格的列配置中我们只绑定了一个日期列,展示时,所有的行转换的列都自动加上了包括我们并没有在 SQL 模型中申明的replay
(因为我们并没有在 SQL 模型中申明,所以表头就直接展示的 replay,而不像其他的申明过的列):
在折线图中我们只需要绑定「数据」->「X 轴绑定字段」,然后将「数据」->「绑定所有的行转列」打开,此时可以将所有行转列字段绑定到折线上形成多系列效果,效果图如下:
绑定所有行转列时的列通用设置
在绑定所有行转列时,在表格组件中,可以对这些列的展示格式等进行统一的设置,如下:
行转列的累计、均值
在使用行转列功能时,Sugar BI默认在数据中自动添加了两个新列: sugar_row2col_total
、sugar_row2col_avg
,分别计算了行转换后的各个新列的累加值
和均值
。
在上面的例子中,sugar_row2col_total
表示 pv、uv、post
这三个行转换后新列的累加值,sugar_row2col_avg
也是同理):
因此,报表编辑者就可以对这两列进行数据建模,并且同样可以将其绑定到图表上进行展示。
对这两列进行建模:
行转列配置字段名称映射
在使用行转列的过程中,可能会出现这样的使用场景:行转列得到的列名只是一个可读性很差的编号,虽然我们可以在绑定数据或建模的时候给它配置展示名称,但如果行转列的数据很多,岂不累死宝宝们了。所以当在图表中配置了「绑定所有的行转列」功能时,Sugar BI支持利用「数据值映射」自动将列名映射为可读性较好的值。
比如下面这个例子,type 字段是行转列后即将作为名称的字段,数据库里保存的是拼音:
直接进行行转列结果如下,可以看到这个拼音虽然可以给用户展示,但用户看到的结果并不直观:
此时可以我们配置这样一个数据值映射:
并在 SQL 模型中进行配置:
就可以完成列名的映射了:
当然,如果有几个特殊的列想在字段名称映射的同时进行特殊的配置,可以在 SQL 模型中单独添加字段并配置显示名称。 下图中对 xiaoshou 这列的展示名称进行了单独配置,还可以注意到图中的右侧红框中,对行转列结果中 xiaoshou 这一列的「取值」也配置了数据值映射:
结果如下: