2017-03-21 14 views
0

Ich habe die folgende Abfrage Kombination:mehrere Zeilen in einzelne Zeile in 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; 

das gibt mir:

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 

durch das obige Ergebnis matr_code, Substantiv, MOD1 und MOD2 sind gleich, aber andere Felder hat sich unterschieden, also insgesamt 6 Zeilen im obigen Ergebnis, aber das Ergebnis in einer Zeile benötigen, unten habe ich Bild für Ihre Ref angebracht.

result will be in single row

+0

Ihr Bild des erwarteten Ergebnisses zeigt immer noch mehrere Zeilen an. –

+0

Dies sollte in Ihrer Präsentationsebene behandelt werden. –

+0

@a_horse_with_no_name siehe das Bild deutlich. es ist nur in einer Reihe, ich habe den Screenshot von MSExcel gemacht. Matr_code, Substantiv, mod1 und mod2 sind die gleichen Daten, die in der Mitte ausgerichtet sind, aber andere Details werden mit alt + enter in einer einzelnen Zelle formatiert. –

Antwort

0

Ihr gewünschte Ergebnis nicht 1NF ist, wie Sie eine Liste der Ergebnisse innerhalb eines einzelnen Datensatzes zurückkehren wollen (das heißt für einen Schlüssel 01102027001|ABRA|--|--, würden Sie ITEM NAME|10 | EMERY | EMERY | Y | --, TYPE |20 | -- | -- | Y | test, und so weiter erhalten möchten). Mit rein relationalen SQL-Abfragen ist das schwer (oder sogar unmöglich) zu erreichen, und das ist wirklich sehr selten so gewünscht.

Relationale Datenbanken (und prostgresql) können mit NON-1NF-Strukturen umgehen, z.B. durch geschachtelte Tabellen oder XML-Ausgabe. Es ist jedoch wahrscheinlich viel einfacher, die Präsentationsschicht so anzupassen, dass der gemeinsame Teil 01102027001|ABRA|--|-- nur einmal gedruckt wird.

0

Sie können versuchen, DISTINCT ON (matr_code, mod1, mod2) statt nur DISTINCT zu verwenden, und array_agg(column_name_here) für alle anderen Spalten zu verwenden, die sich unterscheiden.

+0

Ich habe array_agg() bereits ausprobiert, aber nicht das genaue Ergebnis, wie in meinem obigen Beitrag gezeigt. Gibt es einen anderen Weg? –

Verwandte Themen