c语言求一个季度党费的编码,我想查询连续六个月 木有交党费的人的记录

dues_id number primary key ,  党费表ID

member_id number not null ,人员ID

year_index number not null ,年份

month_1 number ,

month_2 number ,

month_3 number ,

month_4 number ,

month_5 number ,

month_6 number ,

month_7 number ,

month_8 number ,

month_9 number ,

month_10 number ,

month_11 number ,

month_12 number ,

sql不会写  求大神帮忙

18 个解决方案

#1

该回复于2014-11-03 14:54:01被管理员删除

#2

SELECT * FROM  tb

WHERE

DECODE(month_1,0,0,1) ||

DECODE(month_2,0,0,1) ||

DECODE(month_3,0,0,1) ||

DECODE(month_4,0,0,1) ||

DECODE(month_5,0,0,1) ||

DECODE(month_6,0,0,1) ||

DECODE(month_7,0,0,1) ||

DECODE(month_8,0,0,1) ||

DECODE(month_9,0,0,1) ||

DECODE(month_10,0,0,1) ||

DECODE(month_11,0,0,1)||

DECODE(month_12,0,0,1)

LIKE '%000000%'

#3

SELECT * FROM  tb

WHERE

DECODE(month_1,null,0,0,0,1) ||

DECODE(month_2,null,0,0,0,1) ||

DECODE(month_3,null,0,0,0,1) ||

DECODE(month_4,null,0,0,0,1) ||

DECODE(month_5,null,0,0,0,1) ||

DECODE(month_6,null,0,0,0,1) ||

DECODE(month_7,null,0,0,0,1) ||

DECODE(month_8,null,0,0,0,1) ||

DECODE(month_9,null,0,0,0,1) ||

DECODE(month_10,null,0,0,0,1)||

DECODE(month_11,null,0,0,0,1)||

DECODE(month_12,null,0,0,0,1)

LIKE '%000000%'

#4

楼上的写法有点问题,如果跨年的就不行了,比如去年8月到今年3月没交,也算超过半年了

#5

楼主的需求也有些不太清楚

假设一个人在去年10月份才入党,那前9个月肯定没交啊,这样的人员需要查询吗?

#6

引用 5 楼 bw555 的回复:

楼主的需求也有些不太清楚

假设一个人在去年10月份才入党,那前9个月肯定没交啊,这样的人员需要查询吗?

那就查他去年十一月到今年的啊

#7

引用 5 楼 bw555 的回复:

楼主的需求也有些不太清楚

假设一个人在去年10月份才入党,那前9个月肯定没交啊,这样的人员需要查询吗?

需求其实很简单  就是想查出从入党开始 到当前时间有连续六个月  没有交党费的人

#8

入党开始时间从哪获取,你这个表没这信息,还需要其他的表吧

#9

引用 8 楼 bw555 的回复:

入党开始时间从哪获取,你这个表没这信息,还需要其他的表吧

我还有一张人员表  和人员信息扩充表

#10

WITH t1 AS ( -- 列转行

SELECT TO_DATE(TO_CHAR(year_index,'9999')+'-01-01','yyyy-MM-dd') ym, member_id, month_1 fee FROM table1

UNION ALL

SELECT TO_DATE(TO_CHAR(year_index,'9999')+'-02-01','yyyy-MM-dd') ym, member_id, month_2 fee FROM table1

...

UNION ALL

SELECT TO_DATE(TO_CHAR(year_index,'9999')+'-12-01','yyyy-MM-dd') ym, member_id, month_12 fee FROM table1

)

,t2 AS ( -- 排序

SELECT *,

ROW_NUMBER() OVER(PARTITION BY member_id ORDER BY ym) rn

FROM t1

WHERE fee IS NOT NULL

)

-- 求前后两次间隔超6月的

SELECT t2.member_id,

t2.ym,

t3.ym

FROM t2

JOIN t2 t3

ON t3.member_id = t2.member_id

AND t3.rn = t2.rn + 1

WHERE DateDiff(m,t2.ym,t3.ym) > 6

如果只需要列出人员,对结果再做 DISTINCT。

没有入党信息,所以开始没缴费的不能统计。

#11

SELECT MEMBER_ID, REPLACE(WM_CONCAT(S_MON), ',', '')

FROM (SELECT MEMBER_ID,

DECODE(MONTH_1, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_2, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_3, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_4, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_5, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_6, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_7, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_8, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_9, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_10, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_11, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_12, NULL, 0, 0, 0, 1) S_MON

FROM TMPSA

ORDER BY YEAR_INDEX)

GROUP BY MEMBER_ID

HAVING REPLACE(WM_CONCAT(S_MON), ',', '') LIKE '%000000%'

#12

引用 10 楼 Tiger_Zhao 的回复:

WITH t1 AS ( -- 列转行

SELECT TO_DATE(TO_CHAR(year_index,'9999')+'-01-01','yyyy-MM-dd') ym, member_id, month_1 fee FROM table1

UNION ALL

SELECT TO_DATE(TO_CHAR(year_index,'9999')+'-02-01','yyyy-MM-dd') ym, member_id, month_2 fee FROM table1

...

UNION ALL

SELECT TO_DATE(TO_CHAR(year_index,'9999')+'-12-01','yyyy-MM-dd') ym, member_id, month_12 fee FROM table1

)

,t2 AS ( -- 排序

SELECT *,

ROW_NUMBER() OVER(PARTITION BY member_id ORDER BY ym) rn

FROM t1

WHERE fee IS NOT NULL

)

-- 求前后两次间隔超6月的

SELECT t2.member_id,

t2.ym,

t3.ym

FROM t2

JOIN t2 t3

ON t3.member_id = t2.member_id

AND t3.rn = t2.rn + 1

WHERE DateDiff(m,t2.ym,t3.ym) > 6

如果只需要列出人员,对结果再做 DISTINCT。

没有入党信息,所以开始没缴费的不能统计。

能加QQ  详细说下嘛  我是新手 不是很懂

#13

引用 11 楼 snbxp 的回复:

SELECT MEMBER_ID, REPLACE(WM_CONCAT(S_MON), ',', '')

FROM (SELECT MEMBER_ID,

DECODE(MONTH_1, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_2, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_3, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_4, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_5, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_6, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_7, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_8, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_9, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_10, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_11, NULL, 0, 0, 0, 1) ||

DECODE(MONTH_12, NULL, 0, 0, 0, 1) S_MON

FROM TMPSA

ORDER BY YEAR_INDEX)

GROUP BY MEMBER_ID

HAVING REPLACE(WM_CONCAT(S_MON), ',', '') LIKE '%000000%'

能加QQ  详细说下嘛  我是新手 不是很懂

#14

引用 10 楼 Tiger_Zhao 的回复:

WITH t1 AS ( -- 列转行

SELECT TO_DATE(TO_CHAR(year_index,'9999')+'-01-01','yyyy-MM-dd') ym, member_id, month_1 fee FROM table1

UNION ALL

SELECT TO_DATE(TO_CHAR(year_index,'9999')+'-02-01','yyyy-MM-dd') ym, member_id, month_2 fee FROM table1

...

UNION ALL

SELECT TO_DATE(TO_CHAR(year_index,'9999')+'-12-01','yyyy-MM-dd') ym, member_id, month_12 fee FROM table1

)

,t2 AS ( -- 排序

SELECT *,

ROW_NUMBER() OVER(PARTITION BY member_id ORDER BY ym) rn

FROM t1

WHERE fee IS NOT NULL

)

-- 求前后两次间隔超6月的

SELECT t2.member_id,

t2.ym,

t3.ym

FROM t2

JOIN t2 t3

ON t3.member_id = t2.member_id

AND t3.rn = t2.rn + 1

WHERE DateDiff(m,t2.ym,t3.ym) > 6

如果只需要列出人员,对结果再做 DISTINCT。

没有入党信息,所以开始没缴费的不能统计。

排序那边 跑起来报错

#15

引用 14 楼 sinat_22308745 的回复:

排序那边 跑起来报错

*前面没写表名,加上就好了

t2 AS ( -- 排序

SELECT T1.*,

ROW_NUMBER() OVER(PARTITION BY member_id ORDER BY ym) rn

FROM t1

WHERE fee IS NOT NULL

)

#16

#12: 就是把 12 列合并上年份,全部 UNION ALL 起来,... 部分请照样补全。

#15: 我手头没 Oracle,只能靠印象写出来的SQL,有什么错误请帮忙改正。

#17

引用 16 楼 Tiger_Zhao 的回复:

#12: 就是把 12 列合并上年份,全部 UNION ALL 起来,... 部分请照样补全。

#15: 我手头没 Oracle,只能靠印象写出来的SQL,有什么错误请帮忙改正。

已经好了 谢谢 你们了

#18

引用 17 楼 sinat_22308745 的回复:

Quote: 引用 16 楼 Tiger_Zhao 的回复:

#12: 就是把 12 列合并上年份,全部 UNION ALL 起来,... 部分请照样补全。

#15: 我手头没 Oracle,只能靠印象写出来的SQL,有什么错误请帮忙改正。

已经好了 谢谢 你们了

如问题已经解决,请注意即时结贴

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值