我和他们的主人有一张产品表。每个所有者都在自己的行中,并且拥有者类型为主要或次要。并非每个产品都有第二所有者。

我需要得到一个按产品分组的表,第一列中包含主要所有者,第二列中包含所有次级所有者。如果一个产品有多个主要所有者,则应选择第一个,其余的则归第二个所有者。如果产品没有主要所有者,则应仅选择第一个/任何第二个所有者。

这是一个输入表:

+---------+------------+----------+
| Product | Owner Type |  Owner   |
+---------+------------+----------+
| a       | primary    | one      |
| a       | secondary  | two      |
| a       | secondary  | three    |
| b       | primary    | four     |
| b       | secondary  | five     |
| c       | primary    | six      |
| d       | secondary  | seven    |
| e       | secondary  | eight    |
| e       | secondary  | nine     |
| f       | primary    | ten      |
| f       | primary    | eleven   |
| f       | secondary  | twelve   |
| f       | secondary  | thirteen |
+---------+------------+----------+


预期结果是:

+---------+---------------+--------------------------+
| Product | Primary Owner |     Secondary Owners     |
+---------+---------------+--------------------------+
| a       | one           | two, three               |
| b       | four          | five                     |
| c       | six           |                          |
| d       | seven         |                          |
| e       | eight         | nine                     |
| f       | ten           | eleven, twelve, thirteen |
+---------+---------------+--------------------------+


如果您注意到,产品de没有主要所有者,因此它将选择第一个次要所有者,然后不再将其包含在“次要所有者”列中。具有两个主要所有者的产品f类似。

我知道如何按产品group并使用FOR XML PATH连接行/字段。在group中,我知道如何选择Owner Typeprimary的第一个产品。我无法弄清楚选择第一个主要所有者并将其从“次要所有者”列中排除和/或在没有主要所有者的情况下选择第一个次要所有者并将其从“次要所有者”列中排除所需要的逻辑。

我什至不知道从SQL开始。

有任何想法吗?

最佳答案

一种实现方法是分配行号,优先考虑owner_type ='Primary'行。然后将第一行作为主要所有者,将group_concat作为第二所有者。

select product
,max(case when rnum=1 then owner end) as primary_owner
,group_concat(case when rnum<>1 then owner end order by rnum) as secondary_owners
from (select product,owner_type,owner,
      @rn:=case when @prev_product=product then @rn+1 else 1 end as rnum,
      @prev_product:=product
      from tablename
      cross join (select @rn:=0,@prev_product:='',@prev) r
      order by product,owner_type='Primary',owner
     ) t
group by product
order by 1


Sample Demo

09-25 18:17