【问题标题】:sql create columns from group by collectionsql 按集合从组中创建列
【发布时间】:2015-11-11 15:10:14
【问题描述】:

我有一张如下表格的表格

chain   |branch
________|________|
    a   |UK
    a   |US
    b   |ISRAEL
    b   |UK
    b   |FRANCE
    b   |BELGIUM
    c   |NIGERIA

我想按以下格式创建一个新表

chain   |branch_1|branch_2|branch_3|branch_4
________|________|________|________|________|
    a   |  UK    |  US    |--------|--------|
    b   |  ISRAEL|  UK    | FRANCE |BELGIUM |
    c   | NIGERIA|--------|--------|--------|

为了进一步澄清,假设您可以通过(链)进行分组,其中聚合函数是标识,以便

group_1->(element1,element2,element3,..,elementM)
group_2->(element1,element2,element3,..,elementN)
...
group_X->(element1,element2,element3,..,elementZ)

因此将创建一个新表,其中包含 R+K 列,其中 R 是我们分组的列数(在我们的例子中是列“链”,所以 R=1),K 是组的最大计数(在我们的例子中是四个,对应于链'b')

我确信这一定是一个常见问题,所以如果之前已经回答过这个问题,我深表歉意,但我找不到任何东西。

编辑: 这不是数据透视表 在这种情况下,数据透视表将是

chain   |UK      |US      |ISRAEL  |FRANCE  |BELGIUM |NIGERIA |
________|________|________|________|________|________|________|
____a___|____1___|____1___|____0___|____0___|____0___|____0___|
____b___|____1___|____0___|____1___|____1___|____1___|____0___|
____c___|____0___|____0___|____0___|____0___|____0___|____1___|

谢谢!

【问题讨论】:

  • 它不是数据透视表。数据透视表的单元格值是列,我们不这样做
  • 当然是数据透视表,遗憾的是 Teradata 不支持 PIVOT 功能。但是要获得未知数量的列的结果,您总是需要在存储过程中使用一些动态 SQL 来动态创建所需的 SQL....
  • 如果我错了,请纠正我,但“传统”数据透视表在每个新列中都有组中包含的唯一值之一,因此在我们的例子中,新列将是 UK,US ,ISRAEL,FRANCE,BELGIUM,NIGERIA,而这些列中的每一列中的值将对应于第三个初始列上的聚合函数,例如 sum、mean、var 或我们喜欢的任何函数。
  • 与数据透视表的逻辑相同 :-) 顺便说一句,为什么要创建非规范化表?

标签: sql teradata udf


【解决方案1】:

您可以使用条件聚合和row_number()

select chain,
       max(case when seqnum = 1 then branch end) as branch_01,
       max(case when seqnum = 2 then branch end) as branch_02,
       max(case when seqnum = 3 then branch end) as branch_03,
       max(case when seqnum = 4 then branch end) as branch_04
from (select t.*,
             row_number() over (partition by chain order by branch) as seqnum
      from table t
     ) t
group by chain;

注意:您的表格没有指定行顺序的列。 SQL 表代表 无序 集合。没有这样的列,就没有一行在另一行之前或之后的概念。因此,此版本按分支名称排序。您可以通过将order by 子句更改为row_number() 来按您喜欢的方式订购。

【讨论】:

  • 谢谢!但是,在这种情况下,这假设我们先验地知道最大数量。我对更通用的“模式”更感兴趣,可以自动提取这些列。就我而言,这个解决方案应该可以工作:)
  • @BigScratch 。 . . SQL 查询预先定义了它的所有列。因此,您无法使用单个查询来做您想做的事情。您需要使用动态 SQL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 2011-04-16
  • 2023-03-10
  • 1970-01-01
  • 2022-01-20
  • 2023-04-02
  • 2020-07-03
相关资源
最近更新 更多