通过sort - android对group_by项进行SQL查询

时间:2016-05-06 11:50:47

标签: android sqlite sorting

我正在创建具有大量用户输入的数据的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 个答案:

答案 0 :(得分:1)

我无权访问您的数据库架构,但是您可能会使用SQL查询来生成这样的结果,您可以通过&#34;排序&#34;如下:

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-Grade组合的价格不是常数,则此查询存在问题。在这种情况下,您可以使用AVG(Price) AS AveragePrice而不是Price,如示例所示。

&#34;总计&#34;可以使用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查询转换为您选择的查询框架。我还没有这样做,因为你似乎已经证明了如何做到这一点的知识。