求给个sql解决方法,

Landa_Peter 2013-11-27 10:56:32
表结构就是这样:periodid 指的是年月期间,SFQYBJ 指的是对应当月是否全月病假,DCNO就是工号
periodid SFQYBJ DCNO
1310 1.00 000118
1309 0.00 000118
1308 1.00 000118
1307 0.00 000118
1306 0.00 000118
1305 0.00 000118
1304 0.00 000118
1303 0.00 000118
1302 0.00 000118
1301 0.00 000118

想要返回结果月数,要的是periodid年月期间连续的才能把SFQYBJ全月病假相加,
例如,也就是先看1310的对应SFQYBJ是1,再继续看1309是0,因为两个不连续所以
返回0,以此往下,这张表最后返回的全月病假月数是0,因为它们的月数期间
对应的SFQYBJ 都不连续,而如果把1309对应的SFQYBJ 换成1.00的话最后
这张表最终返回的结果就是3+0=3

求方便的解决方法
...全文
184 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Landa_Peter 2013-11-27
  • 打赏
  • 举报
回复
非常感谢大家的帮助
--小F-- 2013-11-27
  • 打赏
  • 举报
回复
if object_id('[tb]') is not null drop table [tb] go create table [tb]([periodid] int,[SFQYBJ] numeric(3,2),[DCNO] varchar(6)) insert [tb] select 1310,1.00,'000118' union all select 1309,1.00,'000118' union all select 1308,1.00,'000118' union all select 1307,1.00,'000118' union all select 1306,0.00,'000118' union all select 1305,1.00,'000118' union all select 1304,1.00,'000118' union all select 1303,0.00,'000118' union all select 1302,0.00,'000118' union all select 1301,0.00,'000118' 这样的结果是不是 6?
--小F-- 2013-11-27
  • 打赏
  • 举报
回复
如果periodid是字符串的话 自己去修改一下关系。CAST periodid AS INT
--小F-- 2013-11-27
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author  :fredrickhu(小F,向高手学习)
-- Date    :2013-11-27 11:10:15
-- Verstion:
--      Microsoft SQL Server 2012 - 11.0.2100.60 (X64) 
--	Feb 10 2012 19:39:15 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([periodid] int,[SFQYBJ] numeric(3,2),[DCNO] varchar(6))
insert [tb]
select 1310,1.00,'000118' union all
select 1309,1.00,'000118' union all
select 1308,1.00,'000118' union all
select 1307,0.00,'000118' union all
select 1306,0.00,'000118' union all
select 1305,0.00,'000118' union all
select 1304,0.00,'000118' union all
select 1303,0.00,'000118' union all
select 1302,0.00,'000118' union all
select 1301,0.00,'000118'
--------------开始查询--------------------------
SELECT
	ISNULL(SUM(SFQYBJ),0)
FROM 
	TB t 
WHERE
	SFQYBJ=1
AND 
	(EXISTS(SELECT 1 FROM TB WHERE DCNO=t.DCNO AND periodid=t.periodid-1 AND SFQYBJ=1)
OR 
	EXISTS(SELECT 1 FROM TB WHERE DCNO=t.DCNO AND periodid=t.periodid+1 AND SFQYBJ=1))


----------------结果----------------------------
/* 3.00
*/
Mr_Nice 2013-11-27
  • 打赏
  • 举报
回复
SELECT  SUM(CONVERT(INT, A.SFQYBJ) & CONVERT(INT, ISNULL(B.SFQYBJ, A.SFQYBJ))  --0,1的话&一下,呵呵
            & CONVERT(INT, ISNULL(B.SFQYBJ, C.SFQYBJ)))
FROM    dbo.TB A
        LEFT JOIN TB B ON LEFT(CONVERT(VARCHAR, A.periodid), 2) = LEFT(CONVERT(VARCHAR, B.periodid),
                                                              2)
                          AND A.periodid + 1 = B.periodid
        LEFT JOIN TB C ON LEFT(CONVERT(VARCHAR, A.periodid), 2) = LEFT(CONVERT(VARCHAR, C.periodid),
                                                              2)
                          AND A.periodid - 1 = C.periodid
  • 打赏
  • 举报
回复
引用 1 楼 ap0405140 的回复:

create table u01
(periodid varchar(10),SFQYBJ decimal(5,2),DCNO varchar(10))

-- 测试1
truncate table u01 

insert into u01
 select '1310',1.00,'000118' union all
 select '1309',0.00,'000118' union all
 select '1308',1.00,'000118' union all
 select '1307',0.00,'000118' union all
 select '1306',0.00,'000118' union all
 select '1305',0.00,'000118' union all
 select '1304',0.00,'000118' union all
 select '1303',0.00,'000118' union all
 select '1302',0.00,'000118' union all
 select '1301',0.00,'000118'

with t as
(select row_number() over(partition by DCNO order by periodid) 'rn',
        SFQYBJ
 from u01)
select sum(case when a.SFQYBJ=1 and (b.SFQYBJ=1 or c.SFQYBJ=1) then 1
                else 0 end) '全月病假月数'
 from t a
 left join t b on a.rn=b.rn+1
 left join t c on a.rn=c.rn-1

/*
全月病假月数
-----------
0

(1 row(s) affected)
*/


-- 测试2
truncate table u01 

insert into u01
 select '1310',1.00,'000118' union all
 select '1309',1.00,'000118' union all   --> 1309对应的SFQYBJ换成1.00
 select '1308',1.00,'000118' union all
 select '1307',0.00,'000118' union all
 select '1306',0.00,'000118' union all
 select '1305',0.00,'000118' union all
 select '1304',0.00,'000118' union all
 select '1303',0.00,'000118' union all
 select '1302',0.00,'000118' union all
 select '1301',0.00,'000118'

with t as
(select row_number() over(partition by DCNO order by periodid) 'rn',
        SFQYBJ
 from u01)
select sum(case when a.SFQYBJ=1 and (b.SFQYBJ=1 or c.SFQYBJ=1) then 1
                else 0 end) '全月病假月数'
 from t a
 left join t b on a.rn=b.rn+1
 left join t c on a.rn=c.rn-1

/*
全月病假月数
-----------
3

(1 row(s) affected)
*/
唐诗三百首 2013-11-27
  • 打赏
  • 举报
回复

create table u01
(periodid varchar(10),SFQYBJ decimal(5,2),DCNO varchar(10))

-- 测试1
truncate table u01 

insert into u01
 select '1310',1.00,'000118' union all
 select '1309',0.00,'000118' union all
 select '1308',1.00,'000118' union all
 select '1307',0.00,'000118' union all
 select '1306',0.00,'000118' union all
 select '1305',0.00,'000118' union all
 select '1304',0.00,'000118' union all
 select '1303',0.00,'000118' union all
 select '1302',0.00,'000118' union all
 select '1301',0.00,'000118'

with t as
(select row_number() over(partition by DCNO order by periodid) 'rn',
        SFQYBJ
 from u01)
select sum(case when a.SFQYBJ=1 and (b.SFQYBJ=1 or c.SFQYBJ=1) then 1
                else 0 end) '全月病假月数'
 from t a
 left join t b on a.rn=b.rn+1
 left join t c on a.rn=c.rn-1

/*
全月病假月数
-----------
0

(1 row(s) affected)
*/


-- 测试2
truncate table u01 

insert into u01
 select '1310',1.00,'000118' union all
 select '1309',1.00,'000118' union all   --> 1309对应的SFQYBJ换成1.00
 select '1308',1.00,'000118' union all
 select '1307',0.00,'000118' union all
 select '1306',0.00,'000118' union all
 select '1305',0.00,'000118' union all
 select '1304',0.00,'000118' union all
 select '1303',0.00,'000118' union all
 select '1302',0.00,'000118' union all
 select '1301',0.00,'000118'

with t as
(select row_number() over(partition by DCNO order by periodid) 'rn',
        SFQYBJ
 from u01)
select sum(case when a.SFQYBJ=1 and (b.SFQYBJ=1 or c.SFQYBJ=1) then 1
                else 0 end) '全月病假月数'
 from t a
 left join t b on a.rn=b.rn+1
 left join t c on a.rn=c.rn-1

/*
全月病假月数
-----------
3

(1 row(s) affected)
*/
内容概要:本文围绕“【SCUC】N-1故障集+安全约束机组组合研究(Matlab代码实现)”展开,系统探讨电力系统在N-1故障场景下的安全约束机组组合(SCUC)问题,旨在实现系统安全性与运行经济性的协同优化。研究通过构建包含机组启停、出力计划、潮流约束、备用容量及N-1安全准则的数学模型,结合混合整数线性规划等优化算法,利用Matlab平台完成仿真解,并引入YALMIP等建模工具提升建模效率。文档提供了完整的代码实现方案与测试案例,涵盖故障集的生成与处理方法,帮助用户掌握鲁棒性和分布鲁棒优化的基本思想,适用于电力系统安全校核与调度决策支持。; 适合人群:电力系统及相关专业的研究生、从事电力调度、能源优化的科研人员及工程技术人员。; 使用场景及目标:① 掌握N-1安全准则在机组组合中的建模方法与实现流程;② 开展安全约束机组组合(SCUC)与安全约束经济调度(SCED)的仿真分析;③ 利用Matlab/YALMIP快速搭建电力系统优化模型并进行解与验证。; 阅读建议:建议读者结合文档内容与网盘提供的完整资源(含代码与数据),动手实践建模与调试过程,重点关注约束条件的设定、故障场景的枚举与处理策略,同时参考相关文献深化对鲁棒优化与分布鲁棒方法的理解。

34,876

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧