2016-05-06 3 views
1

Я создаю приложение для Android с большим количеством данных, которое вводит пользователь.Sql запрос к group_by по сортировке - android

Теперь мне нужно отображать некоторые данные так же, как на изображении ниже enter image description here

Я сделал первую часть изображения, где перечислены все данные. Теперь мне нужно сделать несколько повторений, где данные группируются по роду. Если есть предметы с одинаковым классом, их нужно разместить в одной строке и подсчитать, сколько их кусков, а также суммировать их массы и цены.

Это часть кода, где я отображая itemsList:

public class LogsRecapitulation extends AppCompatActivity { 

    private ListView mainListView; 
    private BaseAdapter listAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_listview); 
     mainListView = (ListView) findViewById(R.id.ListViewItem); 

     //recieve RecepitID in displayLogs.activity 
     final long forwardedId = (long) getIntent().getExtras().get(String.valueOf("recepitID")); 
     List<Logs> logsList = new Select().from(Logs.class).where("Receipt = " + forwardedId).execute(); 


     listAdapter = new RecapitulationArrayAdapter(logsList); 
     mainListView.setAdapter(listAdapter); 
    } 

    private class RecapitulationArrayAdapter extends BaseAdapter { 
     private LayoutInflater inflater; 
     private List<Logs> logsList; 

     public RecapitulationArrayAdapter(List<Logs> logsList) { 
      inflater = LayoutInflater.from(LogsRecapitulation.this); 
      this.logsList = logsList; 
     } 

     @Override 
     public int getCount() { 
      return logsList.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return logsList.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return logsList.get(position).getId(); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if (convertView == null) { 
       convertView = inflater.inflate(R.layout.logs_recapitulation, parent, false); 
      } 
      Logs log = logsList.get(position); 
      ((TextView) convertView.findViewById(R.id.rec_log_sort)).setText(log.sort_id); 
      ((TextView) convertView.findViewById(R.id.rec_log_class)).setText(log.grade); 
      ((TextView) convertView.findViewById(R.id.rec_log_count)).setText(String.valueOf(logsList.size())); 
      ((TextView) convertView.findViewById(R.id.rec_logs_mass)).setText(String.format("%.2f m3", log.getM3())); 

      if (log.receipt.priceType.equals("Na panju")) { 
       ((TextView) convertView.findViewById(R.id.rec_log_price_default)).setText(String.valueOf(log.price.stumpPrice_kn)); 
      } else { 
       ((TextView) convertView.findViewById(R.id.rec_log_price_default)).setText(String.valueOf(log.price.roadPrice_kn)); 
      } 

      if (log.receipt.priceType.equals("Na panju")) { 
       ((TextView) convertView.findViewById(R.id.rec_calculated_price)).setText(String.format("%.2f KN", log.price.stumpPrice_kn * log.getM3())); 
      } else { 
       ((TextView) convertView.findViewById(R.id.rec_calculated_price)).setText(String.format("%.2f KN", log.price.roadPrice_kn * log.getM3())); 
      } 

      return convertView; 
     } 
    } 

Этот верхний код не так уж важно, но для меня важнее, чтобы это сделал это перепросмотр и групповые детали рода и каждого сорта по классам.

Вопрос: Как мне группировать элементы по своему усмотрению и в каждой группе сортировки по классам (как на картинке вверх)? Любая помощь приветствуется!

ответ

1

У меня нет доступа к схеме базы данных, но SQL запросов можно использовать для получения такого результата, где группы по «Роду» выглядит следующим образом:

SELECT Sort, Grade, COUNT(DISTINCT ID) AS Pieces, ROUND(SUM(Mass), 2) AS 
TotalMass, Price, SUM(MassPrice) AS TotalMassPrice 
FROM LogsTable 
GROUP BY Sort, Grade 
ORDER BY Sort DESC, Grade DESC; 

производя таблицу, как следующее:

Group table

Там проблема с этим запросом, если цена для данной комбинации Sort-класса не является постоянной. В этом случае вы можете использовать AVG(Price) AS AveragePrice вместо Price, как в примере.

«полная грандов» строка может быть получена с помощью SQL-запроса как например:

SELECT COUNT(DISTINCT ID) AS TotalPieces, ROUND(SUM(Mass), 2) AS GrandTotalMass, AVG(Price) AS AveragePrice, SUM(MassPrice) AS GrandTotalMassPrice 
FROM LogsTable; 

производит таблицу, как следующее:

Grand total table

Это для меня ясно, что число фактически, сообщается в общей сумме на скриншоте, это не средняя цена, а какая-то другая метрика.

Вы можете легко преобразовать эти SQL-запросы в свою выборку запроса. Я не сделал этого, так как вы, похоже, уже знаете, как это сделать.

Смежные вопросы