PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wählen Sie mehrere Zeilenwerte in einer einzelnen Zeile mit Mehrtabellenklauseln aus

Wenn jedes Attribut nur einen einzigen Wert für einen Benutzer hat, können Sie damit beginnen, eine Sparse-Matrix zu erstellen:

SELECT user_id
      ,CASE WHEN attrib_id = 1 THEN value ELSE NULL END AS attrib_1_val
      ,CASE WHEN attrib_id = 2 THEN value ELSE NULL END AS attrib_2_val
  FROM UserAttribute;

Komprimieren Sie dann die Matrix mit einer Aggregatfunktion:

SELECT user_id
      ,MAX(CASE WHEN attrib_id = 1 THEN value ELSE NULL END) AS attrib_1_val
      ,MAX(CASE WHEN attrib_id = 2 THEN value ELSE NULL END) AS attrib_2_val
  FROM UserAttribute
  GROUP BY user_id;

Als Antwort auf den Kommentar Suche nach Attributname statt nach ID:

SELECT ua.user_id
      ,MAX(CASE WHEN a.attrib_name = 'attrib1' THEN ua.value ELSE NULL END) AS attrib_1_val
      ,MAX(CASE WHEN a.attrib_name = 'attrib2' THEN ua.value ELSE NULL END) AS attrib_2_val
  FROM UserAttribute ua
  JOIN Attribute a ON (a.attrib_id = ua.attrib_id)
  WHERE a.attrib_name IN ('attrib1', 'attrib2')
  GROUP BY ua.user_id;