首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取各行的平均值c#

获取各行的平均值c#
EN

Stack Overflow用户
提问于 2016-01-18 00:14:29
回答 2查看 380关注 0票数 0

我有一个带有表的sql server数据库。这些是

代码语言:javascript
复制
1stAP_TB, 2ndAP_TB, 3rdAP_TB, 4thAP_TB, 1steng_TB, 2ndeng_TB, 3rdeng_TB, 
4theng_TB

他们都排成一排。这些数字将在特定的列上单独求解。现在,我需要知道如何在有行的情况下获得1stAP_TB、2ndAP_TB、3rdAP_TB和4thAP_TB的平均值。

此外,还有多个数据将保存在数据库中。我使用的是C#编程语言。

EN

回答 2

Stack Overflow用户

发布于 2016-01-18 11:43:26

尝试下面的方法

代码语言:javascript
复制
create table aveexample
    (a1stAP_TB int,
    a2ndAP_TB int,
    a3rdAP_TB int,
    a4thAP_TB int,
    a1steng_TB int,
    a2ndeng_TB int,
    a3rdeng_TB int,
    a4theng_TB int
    )

样本数据

代码语言:javascript
复制
insert into aveexample values(1,2,3,4,5,6,7,8)
insert into aveexample values(11,22,33,44,55,66,77,78)
insert into aveexample values(2,3,1,4,10,10,45,5)

方法1

代码语言:javascript
复制
select *, (select AVG(totaldata)
from (values(a1stAP_TB),
(a2ndAP_TB),(a3rdAP_TB),(a4thAP_TB),(a1steng_TB),
(a2ndeng_TB),(a3rdeng_TB),(a4theng_TB)) total(totaldata))as average
from aveexample

方法2

代码语言:javascript
复制
select ((a1stAP_TB)+
(a2ndAP_TB)+(a3rdAP_TB)+(a4thAP_TB)+(a1steng_TB)+
(a2ndeng_TB)+(a3rdeng_TB)+(a4theng_TB))/8 as Average 
from aveexample
票数 0
EN

Stack Overflow用户

发布于 2016-01-18 21:31:27

考虑到问题中非常有限的描述,很难给出具体的建议,但从目前为止的描述和评论来看,在我看来,数据库似乎需要重新设计,以更好地满足您的需求。首先,您没有ID字段,因此无法区分一行和下一行。然后,剩下的就是一系列重复的值。这里的线索是列名中有“1”、“2”、“3”。这可能表示需要将这些列移动到相关表的行中。这看起来可能不是最好的方法,但它被称为"First Normal Form“,是SQL数据库的典型最佳实践。另请参见Database Normalization Basics

在我看来,你在这里拥有的是一些实体(你在问题中没有提到),它有许多与之相关的值。这里的“实体”应该被赋予一个唯一的ID,然后将该实体的所有值与其ID一起存储。

您可能有一个包含以下列的表:

代码语言:javascript
复制
CREATE TABLE MyItems (
ID int NOT NULL,
Sequence int NOT NULL,
Value int NOT NULL,
CONSTRAINT PK_MyValues_ID_Sequence PRIMARY KEY
    (ID,Sequence)
)

注意:ID + sequence形成了表的唯一主键,并使每一行都是唯一的。这还可以让您跟踪项目的添加顺序。这可能对您很重要,也可能不重要,但是每个表可能都应该有一个惟一的主键。

您的数据表将如下所示(该示例表示两个不同的实体,第一个实体有4个值,第二个实体有3个值):

如果不更多地了解应用程序及其功能,就很难展示一个合理的示例。但是有了这个表设计,您就有了一次添加一个值的基础,正如您所说的那样,并有了一种查询它们的方法。您可以使用分组来生成总计和平均值之类的内容,也可以在代码中通过迭代查询结果或在LINQ语句中执行此操作。

然后,您可以使用LINQ查询计算具有给定ID的实体的平均值,如下所示:

代码语言:javascript
复制
var average = MyItems.Where(p=>p.ID == 1).Average(q=>q.Value);  

作为这种方法灵活性的一个示例,您可以很容易地计算整个数据库中输入的每一秒值的平均值:

代码语言:javascript
复制
var averageOfSecondItems = MyItems.Where(p => p.Sequence == 2).Average(q => q.Value);

我展示的示例涉及一种类型的值。在你的问题中,你可能有两种不同类型的值。有几种方法可以处理这个问题-例如,如果值总是成对输入,则可以向表中添加另一列,或者可以创建第二个表来保存单独的值。同样,很难根据给出的有限信息做出推荐。

如果将数据放入第一范式看起来是一项繁重的工作,那么您的应用程序可能更适合文档数据库("NoSQL“数据库),但这实际上是另一个问题。在这个问题中,指定了一个SQL数据库,所以我集中讨论了这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34840506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档