【问题标题】:Displaying multiple columns on one row (SQL)在一行上显示多列 (SQL)
【发布时间】:2015-11-07 19:09:49
【问题描述】:

我正在尝试制作一份报告,该报告在一行中显示父母信息和一个家庭中的所有孩子。 没有“父”表存储有关父母的信息,也没有将父母与孩子联系起来的 ID,也没有将兄弟姐妹与兄弟姐妹联系起来的 ID。判断他们是否是兄弟姐妹的唯一方法是他们是否有相同的地址(逻辑是如果他们有相同的地址,他们就住在一起,并且是同一个家庭的一部分)。所有信息都是从“学生”表或学生表中存储家长信息、他们居住的地址等的自定义字段中提取的。

我不想显示两次父信息,而是显示 像这样的信息: 父母姓名、地址、电话、child1_name、child1_schoolname、child1_age、child2_name、child2_schoolname、child2_age 等(针对该家庭中的每个孩子)

问题在于,并非每个家庭都有相同数量的孩子,我只能通过地址链接兄弟姐妹。

如何在一行中显示每个家庭的所有信息?这可能吗?如何?我尝试过数据透视表,但无济于事。

【问题讨论】:

  • 您应该修改您的问题并提供示例数据和所需的结果。
  • 我想你想要的是一个数据透视表
  • 我已经尝试过数据透视表,但我不想聚合数据并且没有连接字段。我只是可能不知道数据透视表的强大功能,但在这种情况下数据透视表没有帮助。

标签: sql database oracle


【解决方案1】:

这是一个经典的“你不应该在数据库中做报告”的问题。数据库用于数据检索,而不是数据格式化。但是让我们假设您知道这一点并且出于某种原因无论如何都需要这样做。

我会使用的算法是

  1. 跨数据创建一些窗口查询;按地址(可连接值)和sort by age desc 分组。
  2. 创建一个利用此窗口的查询并返回每个组中的第一项。
  3. 创建附加查询,以返回每个组中的第二个、第三个、第四个。等
  4. 将这些外部连接在一起。

如果您定义一些最大数量的兄弟姐妹(五个?),这将容易得多,而不是动态构建这些兄弟姐妹。

如果父母在同一张桌子,你怎么知道哪些是父母,哪些是孩子?

【讨论】:

    【解决方案2】:

    如果您有两个表,一个用于父级(第一个表),一个用于子级(第二个表),如下所示:

    你可以在你的数据模型中做类似的事情:

    select Parent.NAME as parent_name,
       Parent.ADDRESS as parent_address,
       Parent.PHONE AS phone,
       (
            select listagg(Child.NAME,',')
                  within group(order by Child.NAME)
            from CHILD Child
            where Child.ADDRESS=Parent.ADDRESS
       )as children_names,       
       (
            select 
                  listagg(Child.AGE,',')
                  within group(order by Child.NAME)
            from CHILD Child
            where Child.ADDRESS=Parent.ADDRESS
       )as children_ages
    from PARENT Parent .
    

    你会得到输出查询结果:

    Listagg 是您的解决方案,可以根据您的需要将多行合二为一。

    但是,listagg 兼容数据库 11g 和最新版本, 所以如果你有旧版本,这是行不通的。

    希望对您有所帮助。

    【讨论】:

    • 对两张桌子有用,但我只有一张。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    相关资源
    最近更新 更多