2012-03-31 4 views
1

Ich denke, das ist nicht leicht zu verstehen, was ich Titel lesen muss, also werde ich besser erklären. Meine Datenbank ist wie:Wie bekomme ich die Spalte sortiert nach dem Durchschnitt eines Feldes aus einer Tabelle in SQL

Table1 Table1 Table2 Table2 Table3 Table3 und anderen Tabellen wie diese ...

Benutzer in Textfeld einen Wert wie 1 einfügen wird und ich werde sie nur den Namen zeigen, dass 1 enthält. Ich tue dies auf diese Weise:

ArrayList<String> found = new ArrayList<String>(); 
ArrayList<String> allTable = getAllTableInDB(); 

for(String table:allTable){ 
    try { 
     ResultSet rs = stat.executeQuery("SELECT * FROM '"+table+"'"); 
     while(rs.next()){ 
      if(!found.contains(rs.getString("name")) && rs.getString("name").equals(WhatUserInserts)) 
       found.add(rs.getString("name")); 
     } 
    } catch (SQLException ex) { 
     ex.printStackTrace(); 
      Logger.getLogger(DB.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

Was will ich jetzt zu tun ist, um die „besten“ dieser Namen Bestellung von durchschnittlich Spalte v gefunden zu berechnen

Zum einem Tisch weiß ich, dass ich es kann. Verwenden Sie etwas wie:

SELECT name FROM table GROUP BY name ORDER BY AVG(v) DESC 

Wie kann ich das gleiche an dieser Grenze des Wertes einer Tabelle tun?

Ich hoffe, erkläre ich meine Frage auch

GELÖST auf diese Weise DANK Dan P:

ArrayList<String> tables = getAllTableInDB(); 
String query = "SELECT * FROM ("; 
String union = " UNION "; 

for(int i=0;i<tables.size();i++){ 
    query+="SELECT * FROM '"+tables.get(i)+"' WHERE name LIKE '%"+find+"%'"; 
    query = i==tables.size()-1?query:query+union; 
} 

query+=") GROUP BY nome ORDER BY AVG(venduti) DESC"; 
+0

gute Frage .. – JackTurky

Antwort

2

Vorausgesetzt, dass Sie die Max oder Avg wollen aller Tabellen dies wird Ihnen die maximale V-Wert für Namen bekommen . Wenn Sie Avgerage verwenden möchten, verwenden Sie AVG. Ich habe die Frage nicht genau verstanden, aber ich denke das was du willst.

SELECT Name, Max(V) 
FROM 
(
    SELECT Name, v 
    FROM TABLE1 
    UNION 
    SELECT Name, v 
    FROM TABLE2 
    UNION 
    SELECT Name, v 
    FROM TABLE3 
) AS AllTables 
GROUP BY Name 
WHERE Name = 'Jon Doe' 

Nach dem Kommentar haben Sie gefragt, ob Sie die Leistung verbessern könnten. Ja, indem Sie den Namen in die WHERE-Klausel für jede Tabelle aufnehmen, vorausgesetzt, dass ein Index/Primärschlüssel für den Namen vorhanden ist. Sie sollten wahrscheinlich eine Tabellenwertfunktion verwenden, wenn Sie diese Route gehen.

DECLARE @Name NVARCHAR(50) 
SET @Name = 'Jon Doe' 

SELECT Name, Max(V) 
FROM 
(
    SELECT Name, v 
    FROM TABLE1 
    WHERE Name = @Name 
    UNION 
    SELECT Name, v 
    FROM TABLE2 
    WHERE Name = @Name 
    UNION 
    SELECT Name, v 
    FROM TABLE3 
    WHERE Name = @Name 
) AS AllTables 
GROUP BY Name 
+0

kann ich hinzufügen WHERE Zustand zu jedem wählen Sie zuerst FROM? – JackTurky

+0

Ich bearbeite ein bisschen Abfrage, aber das ist was ich brauche .. DANKE !!!!! – JackTurky

+0

siehe Bearbeiten meiner Frage :) – JackTurky

Verwandte Themen