PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wybierz wiele wartości wierszy w jednym wierszu z klauzulami wielu tabel

Jeśli każdy atrybut ma tylko jedną wartość dla użytkownika, możesz zacząć od utworzenia rzadkiej macierzy:

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;

Następnie skompresuj macierz za pomocą funkcji agregującej:

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;

W odpowiedzi na komentarz, wyszukiwanie według nazwy atrybutu, a nie 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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego ten kod nie działa w PostgreSQL i jak to naprawić (obejście)? Czy to usterka silnika Postgres SQL?

  2. geometria nie jest rozpoznawana jako parametr Find_SRID

  3. Nie można zainstalować plpython3u - postgresql

  4. błąd :podzapytanie musi zwrócić tylko jedną kolumnę

  5. Jak przekonwertować liczbę całkowitą na łańcuch i uzyskać długość łańcucha?