首页 / 浏览问题 / 组件GIS / 问题详情
字段分组查询
35EXP 2022年04月10日
使用产品: iObject.NET 10.2.1

问题描述:请问官方帮助文档里的Group by分组示例 ——例如:select World_Countries.CONTINENT,Count(World_Countries.SmID) as Count from World_Countries group by World_Countries.CONTINENT 对世界地图中每一组CONTINENT相同的记录进行统计个数,即该洲内所有国家的个数。 ——要如何使用 QueryParameter类实现

现在我想要基于字段A进行分组,得到每一个字段A的值所对应的全部字段B的平均值,不知道用什么方法

2 个回答

您好,在您指定正确分组字段基础上使用聚合函数几号,如您问题里写的示例用的是Count()计数聚合函数,

平均数使用Avg()聚合函数即可,和普通的数据库查询基本一致的。

如果您不太了解sql查询或者不太实用数据库,那您使用的过程中建议您先在桌面端构造确认正确的sql语句后,再到桌面端来使用。

希望可以帮助到您。
10,398EXP 2022年04月11日
但是帮助文档中QueryParameter.GroupBy要求QueryParameter.ResultFields属性中的字段与本属性中的字段相同时,GroupBy属性才有效。但是我分组的字段应该是“商品类型”,我期望得到的结果字段应该是{“商品类型”,Avg(“销量”)},这两者必然不一致,如何处理
是需要包含就行,不是只能唯一。

您具体使用就像给您说的,建议您直接桌面端先行查询使用,确认正确的参数再来组件端使用,减少您的尝试时间成本。

您好,查询平均值的话建议使用 Avg 聚合函数,如:Avg(B)

根据您的描述,建议您在 QueryParameter.ResultFields 属性中设置 Avg 聚合函数,在 QueryParameter.GroupBy 属性中设置分组字段,详情可参考 SuperMap iObjects .NET 安装目录\Help目录下的帮助文档,检索 QueryParameter 成员

详细使用方式建议您参考 SuperMap iObjects .NET 安装目录\Help目录下的帮助文档,检索 属性查询(SQLQuery),该示例展示了如何具体使用 QueryParameter 进行 SQL 查询。

希望可以帮到您。

2,248EXP 2022年04月11日
但是帮助文档中QueryParameter.GroupBy要求QueryParameter.ResultFields属性中的字段与本属性中的字段相同时,GroupBy属性才有效。但是我分组的字段应该是“商品类型”,我期望得到的结果字段应该是{“商品类型”,Avg(“销量”)},这两者必然不一致,如何处理

您好,其实并不影响,您的返回类型中存在分组字段,您的分组效果即可生效。如下代码,是我对 SQLQuery 示例项目的一点儿小改动,用于展示满足您需求的实现:

/// <summary>
        /// 输出查询结果
		/// Output the query result
        /// </summary>
        /// <param name="datasetVector"></param>
        private static void SqlQuery(DatasetVector datasetVector)
        {
            // 构造查询参数类,设置查询条件
            // Initialize the query parameter class
            string[] resultFields = new string[] { "NAME", "DEPTH", "AVG(SmArea) as avgArea", "Count(SmArea) as countArea", "Sum(SmArea) as sumArea" };

            QueryParameter queryParameter = new QueryParameter();
            queryParameter.AttributeFilter = "DEPTH==-999";
            queryParameter.ResultFields = resultFields;
            queryParameter.CursorType = CursorType.Static;
            queryParameter.HasGeometry = false;
            queryParameter.GroupBy = new string[] { "DEPTH" };

            Recordset recordset = null;
            try
            {
                // 查询得到结果记录集
                recordset = datasetVector.Query(queryParameter);

                // 输出记录集记录
				//Get the result dataset.
				PrintWithStar(m_outputresult);
                ListAll(recordset);
                PrintWithStar(m_outputresult);
            	
			}
            catch (Exception ex)
            {

                Console.WriteLine(ex.Message);
            }
            finally
            {
                // 释放记录集
				//Dispose the recordset.
                recordset.Dispose();
            }
        }

建议您参考上述代码逻辑实现分组计算平均值。

...