当前位置: 首页 > 知识库问答 >
问题:

在另一列不相同的情况下对另一列的值求和

邓开济
2023-03-14

Hi StackOverFlow成员

reports=表名。

数据库

CREATE TABLE `reports` (
  `id` int(11) NOT NULL auto_increment,
  `report_day_name` varchar(20) NOT NULL,
  `report_day` varchar(20) NOT NULL,
  `report_month` varchar(20) NOT NULL,
  `report_year` varchar(20) NOT NULL,
  `report_result_number` varchar(20) NOT NULL,
  `report_result_text` varchar(20) NOT NULL,
  `report_since` varchar(20) NOT NULL,
  `report_date` varchar(20) NOT NULL,
  `catid` int(11) NOT NULL,
  `subjectid` int(11) NOT NULL,
  `userid` int(11) NOT NULL,
  `groupid` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=78 ;

INSERT INTO `reports` VALUES (73, 'day', '14', '1', '1434 h', '5', 'rate', '1234567890', '1434-1-14', 1, 132, 33, 35);
INSERT INTO `reports` VALUES (74, 'day', '12', '2', '1435 h', '4', 'rate', '1234567890', '1434-2-12', 2, 136, 36, 35);
INSERT INTO `reports` VALUES (75, 'day', '14', '1', '1434 h', '2', 'rate', '1354488730', '1434-1-14', 1, 132, 33, 35);
INSERT INTO `reports` VALUES (76, 'day', '12', '2', '1435 h', '4', 'rate', '1354488730', '1434-2-12', 2, 137, 36, 35);
INSERT INTO `reports` VALUES (77, 'day', '12', '2', '1435 h', '1', 'rate', '1354488730', '1434-2-12', 2, 134, 33, 35);

这是数据库表:

id  report_result_number    subjectid   userid
73  5                       132         33
74  4                       136         36
75  2                       132         33
76  4                       137         36
77  1                       134         33

我想sum(reports.report_result_number)where(reports.subjectId)是distinct

当我运行这段代码时..

SELECT
  users.user_id, users.user_name, users.user_country, SUM(reports.report_result_number) AS AllTotal, COUNT(DISTINCT reports.subjectid) AS TotalSubjects
FROM
  users
  INNER JOIN reports ON users.user_id = reports.userid
GROUP BY
  users.user_id
  ORDER BY
  AllTotal DESC LIMIT 4

它返回AllTotal

user_id user_name   user_country    AllTotal    TotalSubjects
36       name         country        8 (correct)        2
33        name        country        8 (not correct)    2

共有1个答案

张岳
2023-03-14

这个问题有两种解释。

<罢工> 如果您想要的是 result_report_number仅当给定的subjectid和userid只有一行时才包含在和聚合中(如果同一subjectid有多行,则希望排除所有这些行的report_result_number...

那么类似这样的事情就会起作用:

SELECT u.user_id
     , u.user_name
     , u.user_country
     , SUM(s.report_result_number) AS AllTotal
     , COUNT(DISTINCT r.subjectid) AS TotalSubjects
  FROM users u
  JOIN reports r
    ON r.userid = u.user_id
  JOIN ( SELECT d.userid
              , d.subjectid
              , d.report_result_number
           FROM reports d
          GROUP
             BY d.userid
              , d.subjectid
         HAVING COUNT(1) = 1
       ) s
    ON s.userid = r.userid
 GROUP
    BY u.user_id
 ORDER
    BY AllTotal DESC
 LIMIT 4

这只是请求的结果集的一种(奇数)解释。示例数据和预期的结果集将有助于澄清规范。

对于添加到问题中的数据,该查询应该返回,例如。

36 fee fi   8  2 
33 foo bar  1  2 

有两行用户33的subjectid值为132,因此这些行的report_result_number被排除在总和之外。subjectid有两个不同的值(132和134),因此我们返回一个:distinct:count of 2。

<罢工> 如果您要求SUM仅在给定用户的subjectid没有重复值时才返回值...

SELECT u.user_id
     , u.user_name
     , u.user_country
     , IF(COUNT(DISTINCT r.subjectid) = COUNT(r.subjectid)
         ,SUM(r.report_result_number)
         ,NULL
       ) AS AllTotal
     , COUNT(DISTINCT r.subjectid) AS TotalSubjects
  FROM users u
  JOIN reports r
    ON r.userid = u.user_id
 GROUP
    BY u.user_id
 ORDER
    BY AllTotal DESC
 LIMIT 4

哈桑说...“如果[给定用户ID的subjectid]有重复值,请获取其中一个值”

只需从别名为s的内联视图中删除HAVING子句。这将返回一行的report_result_number值。(从哪个“匹配”行返回值是任意的:

SELECT u.user_id
     , u.user_name
     , u.user_country
     , SUM(r.report_result_number) AS AllTotal
     , COUNT(DISTINCT r.subjectid) AS TotalSubjects
  FROM users u
  JOIN ( SELECT d.userid
              , d.subjectid
              , d.report_result_number
           FROM reports d
          GROUP
             BY d.userid
              , d.subjectid
       ) r
    ON r.userid = u.user_id
 GROUP
    BY u.user_id
 ORDER
    BY AllTotal DESC
 LIMIT 4

为了使resultset可重复,为了始终获得最低或最高值,可以添加一个聚合函数来指定返回哪个值。

替换...

          , d.report_result_number

与...

          , MAX(d.report_result_number)  AS report_result_number

使用MAX()聚合,将返回:

36 fee fi   8  2
33 foo bar  6  2

(查询将获得subjectid=132 userid=33的值“5”,并将省略相同subjectid的值“2”。)如果没有MAX聚合,查询可以有效地(且任意地)返回一个“3”来代替“6”。(它可以包含“5”或“2”,并省略另一个。)

Q:如何在代码中使用(where report_month='number')?

A:在内联视图中,在GROUP BY子句之前的FROM子句之后添加WHERE子句。替换此:

       FROM reports d
      GROUP

与例如。

       FROM reports d
      WHERE d.report_month = 'number'
      GROUP

仅返回满足指定谓词的行。

 类似资料:
  • 我想运行一个mysql查询,从一个表中选择所有行,,其中列的值在另一列()的所有值中的任何位置都不存在。 以下是我的表格的简化版本,其中包含以下内容: 我的问题是: 在本例中,我希望选择标题为和的行,但我的查询没有返回任何行。 以下是表格结构:

  • 问题内容: 我有一个表,其中包含商店中每件商品的单价和其他详细信息。 另一个包含每个订单中包含的项目的详细信息。 现在我要计算 请注意,我希望它成为表本身的一部分,而不是作为其他视图或查询。我怎样才能做到这一点?我为此研究了触发器和其他机制,但是它们是否适用于不同表中的值,尤其是在存在此类约束的情况下? 我尝试过根据另一列计算出的Column进行以下触发吗?: 但这似乎没有用 问题答案: 这是如何

  • 我试图编写正确的查询,但它们显示的结果不正确。例如,我有表ABC: 在c栏中只能b_id 因为111在a_id10或11不是12我怎样才能找到它?我需要找到列C中发生(无效)值b_id的所有行,它们不在同一个a_id中。Sql(postgresql)不能正常工作,为什么?感谢任何帮助。 我的sql:

  • 我试图让发送消息给另一方的用户和接收消息的用户在每行的一行中。 那么oracle sql查询应该是什么呢

  • 问题内容: 我想将一列的值除以另一列的值,并将结果显示为单独的列 前任: 现在我想将总百分比除以屏幕编号,然后在另一列中显示结果 问题答案:

  • 如何在同一表中从一列插入值到另一列? 说我有: 我要求: 换句话说,我想复制'Suburb2'和'Date',并将它们分别作为新行插入'Date'和'suburban'。 我知道我可以通过首先复制到临时列/s并稍后清理来实现这一点,但我想知道是否有一种方法可以在一个查询中实现这一点? 我试过了 但得到的列“日期”不存在错误。