在postgresql中将多行组合成单行

时间:2017-03-21 07:46:43

标签: sql postgresql

我有以下查询:

SELECT distinct items.matr_code,mm_nounmodmaster.noun,mm_nounmodmaster.modifier1,mm_nounmodmaster.modifier2,mm_attributemaster.attribute, mm_templateattributes.sequence, 
mm_itemvaluemaster.itemvalue, mm_itemvaluemaster.abbrvalue, mm_templateattributes.mand_ind, mm_sourcemaster.source_code
FROM mm_items items
      INNER JOIN mm_nounmodmaster ON items.nm_code = mm_nounmodmaster.nm_code 
      INNER JOIN mm_itemattributes ON items.id = mm_itemattributes.items_id
      INNER JOIN mm_itemvaluemaster ON mm_itemattributes.itemvalmaster_id = mm_itemvaluemaster.id
      INNER JOIN mm_templateattributes ON mm_itemattributes.templateattributes_id = mm_templateattributes.id
      INNER JOIN mm_attributemaster ON mm_templateattributes.attribute = mm_attributemaster.id
      INNER JOIN mm_sourcemaster ON mm_itemattributes.source = mm_sourcemaster.id
      WHERE items.matr_code='01102027001' group by items.matr_code,mm_attributemaster.attribute, mm_templateattributes.sequence, 
mm_itemvaluemaster.itemvalue, mm_itemvaluemaster.abbrvalue, mm_templateattributes.mand_ind, mm_sourcemaster.source_code,mm_nounmodmaster.noun,mm_nounmodmaster.modifier1,mm_nounmodmaster.modifier2;

给了我:

matr_code  |noun|mod1| mod2 |  attr  |seq | i_val | a_val  |m_ind|source

01102027001|ABRA|  --  | -- |ITEM NAME|10 | EMERY | EMERY  | Y   | --
01102027001|ABRA|  --  | -- |TYPE     |20 | --    | --     | Y   | test    
01102027001|ABRA|  --  | -- |MATERIAL |30 | --    | --     | Y   | test
01102027001|ABRA|  --  | -- |SIZE,GRIT|40 | 100   | 100    | Y   | test
01102027001|ABRA|  --  | -- |DIMENSION|50 | 280mm | 280mm  | Y   | --
01102027001|ABRA|  --  | -- |ADDITIONAL|60| DRILL | DRILL  | N   | test

通过上面的结果matr_code,noun,mod1和mod2是相同的,但是其他字段有所不同,所以在上面的结果中总共有6行,但需要在单行中得到结果,下面我为你的Ref附加了图像。

result will be in single row

2 个答案:

答案 0 :(得分:0)

您想要的结果不是1NF,因为您想要在单个记录中返回结果列表(例如,对于密钥01102027001|ABRA|--|--,您希望获得ITEM NAME|10 | EMERY | EMERY | Y | --TYPE |20 | -- | -- | Y | test,等等)。使用纯粹的关系型SQL查询,这很难(甚至不可能)实现,而且实际上很少需要这种方式。

关系数据库(和prostgresql)可以处理NON-1NF结构,例如通过使用嵌套表或XML输出。但是,调整表示层可能要容易得多,因此公共部分01102027001|ABRA|--|--只打印一次。

答案 1 :(得分:0)

您可能希望尝试使用DISTINCT ON (matr_code, mod1, mod2)而不只是DISTINCT,并对所有其他不同的列使用array_agg(column_name_here)