oracle是否同月,探讨一个同一张表中,在一个sql中取不同月份数据对比的问题

表名  xxta_account_f

表结构

account,number,date

101,1000,31-DEC-07

101,2000,30-NOV-07

102,200,31-DEC-07

102,400,30-NOV-07

103,100,31-DEC-07

103,800,30-NOV-07

104,2100,31-DEC-07

104,4100,30-NOV-07

要求是按account条件组合,取出当月数据,上月数据,年初数据,去年同期数据进行比较

要求报表结构

gather_account|当月数据|上月数据|年初数据|去年同期数据|(一些比较,用discover上工具做了)

短期(101)         |1000     |2000    |  xxxx   |xxxxxx        |

长期(102+103) |300       |1200    |  xxxx   |xxxxxx        |

中期(104)         |2100     |4100    |  xxxx   |xxxxxx        |

我写的sql

select  '短期' gather_account,a1.number 当月数据,a2.number 上月数据,a3.number 年初数据,a4.number 去年同期数据

from xxta_account_f_a  a1,xxta_account_f_a  a2,xxta_account_f_a  a3,xxta_account_f_a  a4

where add_months(a1.date,-1)=a2.date

and extract(year from a1.date)-1||1231 = to_char(a3.date,'yyyymmdd')

and add_months(a1.date,-12)=a4.date(+)

union

select  '长期' gather_account,b1.number 当月数据,b2.number 上月数据,b3.number 年初数据,b4.number 去年同期数据

from xxta_account_f_b  b1,xxta_account_f_b  b2,xxta_account_f_b  b3,xxta_account_f_b  b4

where add_months(b1.date,-1)=b2.date

and extract(year from b1.date)-1||1231 = to_char(b3.date,'yyyymmdd')

and add_months(b1.date,-12)=b4.date(+)

union

select  '中期' gather_account,c1.number 当月数据,c2.number 上月数据,c3.number 年初数据,c4.number 去年同期数据

from xxta_account_f_c  c1,xxta_account_f_c  c2,xxta_account_f_c  c3,xxta_account_f_c  c4

where add_months(c1.date,-1)=c2.date

and extract(year from c1.date)-1||1231 = to_char(c3.date,'yyyymmdd')

and add_months(c1.date,-12)=a4.date(+)

--------------------------------

其中xxta_account_f_a

select sum(number),date  from xxta_account_f_a where account=101 group by date

其中xxta_account_f_b

select sum(number),date  from xxta_account_f_a where account in (102,103) group by date

其中xxta_account_f_c

select sum(number),date  from xxta_account_f_a where account=104 group by date

----------------------------------

请大家看看能不能改的简单一点,总感觉这个语句运行的颇慢.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下 SQL 语句查询同一张不同分组不同值: SELECT 分组列, COUNT(DISTINCT 不同值列) FROM 表名 GROUP BY 分组列; 其中,分组列是指需要分组的列,不同值列是指需要统计不同值的列。使用 COUNT(DISTINCT 不同值列) 可以统计不同值的数量。 ### 回答2: 可以使用SQL的GROUP BY子句和HAVING子句来查询同一张表中不同分组的不同值。具体的步骤如下: 1. 假设有一个名为table_name的表,其中包含了一个名为column_name的列。 2. 使用GROUP BY子句将表按照column_name分组。 3. 使用HAVING子句筛选出只有一个唯一值的分组。 4. 查询结果将会是所有与column_name的唯一值对应的分组。 下面是一个具体的SQL查询示例: ```sql SELECT column_name FROM table_name GROUP BY column_name HAVING COUNT(*) = 1; ``` 在这个查询中,我们首先通过GROUP BY子句将表按照column_name分组。然后,我们使用HAVING子句筛选出只有一个唯一值的分组,即COUNT(*) = 1。最后,我们选择了column_name列作为查询结果。 如果有多个不同分组的不同值,这个查询将返回所有这些值。如果没有满足条件的分组,查询将返回空结果。 需要注意的是,在实际的数据库中,table_name和column_name需要替换为实际的表名和列名。 ### 回答3: 可以使用SQL语句实现在同一张表中不同分组的不同值的查询。以下是一个示例查询: ``` SELECT 分组列, 不同值列 FROM 表名 GROUP BY 分组列, 不同值列; ``` 其中,分组列是指将表中数据按照某一列进行分组,而不同值列是指需要查询的表中不同值列。 例如,假设有一个名为"学生"的表,包含3个列:姓名、年龄、性别。我们要查询不同年龄下的不同性别。 假设表中数据如下: ``` 姓名 | 年龄 | 性别 --------------- 小明 | 20 | 男 小红 | 20 | 女 小刚 | 18 | 男 小丽 | 18 | 女 ``` 我们可以使用以下SQL语句进行查询: ``` SELECT 年龄, 性别 FROM 学生 GROUP BY 年龄, 性别; ``` 执行以上查询后,将会返回以下结果: ``` 年龄 | 性别 --------- 20 | 男 20 | 女 18 | 男 18 | 女 ``` 这样就能够查询到同一张表中不同分组的不同值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值