在一行上显示多个列(SQL)

时间:2015-11-07 19:09:49

标签: sql database oracle

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

我想要显示两次而不是显示父信息 这样的信息: Parent_name,address,phone,child1_name,child1_schoolname,child1_age,child2_name,child2_schoolname,child2_age等(对于该家庭中的每个孩子)

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

如何在一行中显示每个家庭的所有信息?这可能吗?怎么样?我试过数据透视表,但没有用。

2 个答案:

答案 0 :(得分:0)

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

我将使用的算法是

  1. 在数据中创建一些窗口查询;按地址分组(可加入值)和sort by age desc
  2. 创建一个使用此窗口的查询,并返回每个组中的第一个项目。
  3. 创建其他查询,返回每组中的第二个,第三个,第四个。等
  4. 外面加入这些。
  5. 如果您定义一些最大数量的兄弟姐妹(五个?)而不是动态构建这些兄弟姐妹,这将会容易得多。

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

答案 1 :(得分:0)

如果您有两个表,一个用于Parent(第一个表),另一个用于Children(第二个表),如下所示:

enter image description here

您可以在数据模型中执行类似的操作:

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 .

您将获得输出查询结果:

enter image description here

Listagg 是您的解决方案,可以将多个行合并为一个。

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

希望得到这个帮助。