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,有什么错误请帮忙改正。
已经好了 谢谢 你们了
如问题已经解决,请注意即时结贴