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

sql查询如何在一个表中使用同一列计算值?

墨安阳
2023-03-14

我想在一个名为table\u name的表中计算名为value的同一列:

CREATE TABLE IF NOT EXISTS Table_Name(
Code VARCHAR(20)          COMMENT 'Code',
Date                      COMMENT 'Date',
Value DECIMAL(25,2)         COMMENT 'Value',
Remark STRING                 COMMENT 'Value type, "111, 222, or 333 etc"',

假设我需要在20180201和20180228之间计算“(值的类型=111或222或333)/(值的类型=444)”,我使用SQL查询如下:

select t.code,t.date,t.remark,t1.value/t2.value as val
from table_name t
    right join (
        select sum(t.value) fzqsz, t.code from table_name t
        WHERE remark = '111' OR remark = '222' OR remark = '333'
        group by t.code,t.date
    ) t1 on t.code = t1.code
    left join (
        select sum(t.value) value,t.code from table_name t
        WHERE remark = '444'
        group by t.code,t.date
    ) t2 on t1.code = t2.code
    -- if I put below line in `SQL query` I get nothing(0 results)
    -- where t.code='00001' and t.date >='20180201' and date <= '20180228' 

我只选择了备注=“111或222或333”,我不知道为什么会出现所有备注(“555和666”),我得到的结果如下:

    code         date              remark                  val
1   00001   2018-02-25 00:00:00.0    111                0.00002929
2   00001   2018-02-25 00:00:00.0    222                0.00002977
3   00002   2018-02-25 00:00:00.0    333                0.00002917
4   00003   2018-02-25 00:00:00.0    444                0.00002987
3   00001   2018-02-25 00:00:00.0    555                0.00002917
4   00002   2018-02-25 00:00:00.0    666                0.00002987

SQL查询正确吗?我确信我的SQL查询有问题。非常感谢您的建议。

共有3个答案

米元凯
2023-03-14

艾尔莎,你只对答案做出反应是没有意义的。这两张海报只是猜测你可能想要实现什么。在你的要求下有一些问题,你到目前为止还没有做出反应。您使用的真的是Oracle吗?表的键是什么(即,什么唯一地标识一行)?为什么在子查询中按日期分组?您希望得到什么样的结果行?

由于你似乎没有阅读评论,我已经发布了这个作为回答。

柏修洁
2023-03-14

您可以使用select case,而不是合并相同的表。

select t2.code, t2.date, t2.remark, t3.val/t3.val2 from 
table_name t2
inner join (
    select t.code, sum(case when t.remark in ('111', '222', '333') then 1 else 0 end) as val
        , sum(case when t.remark in ('444') then 1 else 0 end) as val2
    from table_name t
    where t.code = '00001' and t.date between '20180201' and '20180228'
    group by t.code) t3 on t3.code = t2.code
where t2.remark in ('111', '222', '333', '444')
单于轶
2023-03-14

使用内部连接和多个可以在

select t.code,t.date,t.remark,t1.value/t2.value as val
from table_name t
     join (
        select sum(t.value) fzqsz, t.code from table_name t
        WHERE remark in( '111','222' ,'333')
        group by t.code,t.date
    ) t1 on t.code = t1.code
     join (
        select sum(t.value) value,t.code from table_name t
        WHERE remark = '444'
        group by t.code,t.date
    ) t2 on t1.code = t2.code 
    where t.code='00001' and t.date >='20180201' and date <= '20180228'

您可以在以下情况下使用case:

 select (sum(case when remark in( 111,222 ,333) then t.value else 0 end)/
 sum(case when remark=444 then t.value else 0 end)) as val,
 t.code,t.date from table_name t
 where t.code='00001' and t.date >='20180201' and date <= '20180228'
  group by t.code,t.date
 类似资料:
  • 问题内容: 我需要在一个查询中计算两列中某些数据的出现总数。数据库位于SQL Server 2005中。 例如,我有此表: 我需要查询一个结果: 1.名为“约翰”的人数 2.年龄超过30岁的“约翰”的人数。 我可以通过这种方式对子查询进行操作(这只是示例): 但这非常慢,我正在寻找更快的方法。 与使用子查询相比,您是否知道一种更好的方法来计算一个查询中的少量计数? 问题答案: 使用CASE语句,您

  • 问题内容: 我在Sqlite中有一个查询,其中涉及复杂的列计算,可以这样说: 我想将此计算选择为,但我还需要将其用作另一种计算的组成部分: 不幸的是,这会产生错误: 我知道我可以简单地重复计算: 但是,假设操作复杂且昂贵,是否有什么方法可以在以后重新引用它而不必重新计算呢? 问题答案: 您需要使用子查询。 结果

  • 问题内容: 我想使用查询显示来自不同行的两个值。 这是表结构: 我想从日期2014-11-07减去日期2014-11-08。 输出应该像 问题答案: 您可以使用联接获取行,然后减去值:

  • 问题内容: 假设我具有以下表格结构: 是否可以运行单个查询以结合以下两个条件: 此人正在关注多少用户 从t1 WHERE userID_follower =“。$ myID”中选择COUNT(id)。。” 有多少用户关注此人 从t1 WHERE userID_following =“。$ myID”中选择COUNT(id)。 谢谢。 问题答案: 在MySql中,您可以在条件上使用该函数,因为错误条

  • 问题内容: 有没有一种方法可以查询数据库以找出所有表中有多少行? IE 希望你能指教 问题答案: