2016-07-07 10 views
1

entsprechenden habe ich eine SQL-Tabelle:Erstellen zusätzlicher Spalte in SQL, die Anzahl der Werte halten, um bestimmte Spalten

id p_action0 p_action1 p_action2 
1 p_A_id1  p_B_id3 p_A_id2 
2 p_A_id1  p_C_id3 p_B_id1 
3 p_A_id1  p_A_id1 p_A_id1 
4 p_B_id1  p_B_id1 p_C_id3 
5 p_B_id1  p_B_id1 p_A_id1 

Es gibt drei Arten von Maßnahmen: p_A, p_B, p_c. Jetzt muss ich die Tabelle mit 3 zusätzlichen Spalten aktualisieren, die eine Zählung für jede ID jedes Typs gibt. Was wäre die Oracle SQl-Abfrage dafür? Der Final Table sollte so sein.

id p_action0 p_action1 p_action2 TypeA TypeB TypeC 
1 p_A_id1  p_B_id3  p_A_id2  2  1  0 
2 p_A_id1  p_C_id3  p_B_id1  1  1  1 
3 p_A_id1  p_A_id1  p_A_id1  3  0  0 
4 p_B_id1  p_B_id1  p_C_id3  0  2  1 
5 p_B_id1  p_B_id1  p_A_id1  1  2  0 

Antwort

1
UPDATE MY_SQL_TABLE 
    SET TypeA = 
      (CASE WHEN p_action0 LIKE 'p_A%' THEN 1 ELSE 0 END) 
      + (CASE WHEN p_action1 LIKE 'p_A%' THEN 1 ELSE 0 END) 
      + (CASE WHEN p_action2 LIKE 'p_A%' THEN 1 ELSE 0 END), 
     TypeB = 
      (CASE WHEN p_action0 LIKE 'p_B%' THEN 1 ELSE 0 END) 
      + (CASE WHEN p_action1 LIKE 'p_B%' THEN 1 ELSE 0 END) 
      + (CASE WHEN p_action2 LIKE 'p_B%' THEN 1 ELSE 0 END), 
     TypeC = 
      (CASE WHEN p_action0 LIKE 'p_C%' THEN 1 ELSE 0 END) 
      + (CASE WHEN p_action1 LIKE 'p_C%' THEN 1 ELSE 0 END) 
      + (CASE WHEN p_action2 LIKE 'p_C%' THEN 1 ELSE 0 END); 

Als Ansicht:

CREATE OR REPLACE VIEW MY_SQL_VIEW 
AS 
    SELECT id, 
      p_action0, 
      p_action1, 
      p_action2, 
      (CASE WHEN p_action0 LIKE 'p_A%' THEN 1 ELSE 0 END) 
      + (CASE WHEN p_action1 LIKE 'p_A%' THEN 1 ELSE 0 END) 
      + (CASE WHEN p_action2 LIKE 'p_A%' THEN 1 ELSE 0 END) 
      typeA, 
      (CASE WHEN p_action0 LIKE 'p_B%' THEN 1 ELSE 0 END) 
      + (CASE WHEN p_action1 LIKE 'p_B%' THEN 1 ELSE 0 END) 
      + (CASE WHEN p_action2 LIKE 'p_B%' THEN 1 ELSE 0 END) 
      typeB, 
      (CASE WHEN p_action0 LIKE 'p_C%' THEN 1 ELSE 0 END) 
      + (CASE WHEN p_action1 LIKE 'p_C%' THEN 1 ELSE 0 END) 
      + (CASE WHEN p_action2 LIKE 'p_C%' THEN 1 ELSE 0 END) 
      typeC 
    FROM my_sql_table; 

... und dann:

SELECT * FROM MY_SQL_VIEW; 
+1

nur ein Kommentar, den ich allein die ursprüngliche Tabelle verlassen und eine Lösung wie UltraCommits implementieren als eine Sicht. Zeigen Sie dann die Informationen aus der Ansicht an, andernfalls wird es ein Alptraum, wenn Sie versuchen, diese Tabelle mit CRUD-Operationen synchron zu halten. –

+0

... gerade editiert die Lösung mit einer Oracle-Ansicht hinzufügen! – UltraCommit

Verwandte Themen