判断查询问题

Pact_Alice 2016-01-25 10:02:25
--我想将Formula字段中T替换为ElementRelationCode中相对应的T字段的IsIsConform,并根据Formula做判断,如果formula中的成立就是Yes,不成立就是NO
--例如P1中 T1 与T2的IsIsConform都是1 ,formula要求T1=1 or T2=1 ,都符合,那么P1这个就是Yes
--例如P2中 T1 与T2的IsIsConform是1 和0 formula要求T1=1 or T2=1 ,有一个符合,那么P2这个也是Yes
--例如P3中 T1 与T2的IsIsConform是0, formula要求T1=1 or T2=1 ,没有符合,那么P3就是No
;WITH cet AS (
select 'P1'PromotionCode,'R1'ElementRelationCode,0IsConform,'When (T1=1 or T2=1)then R1'formula,'买数量送数量'DESC0 union all
select'P1','T1',1,'When(T1=1 or T2=1)then R1', '销售数量' union all
select'P1','T2',1,'When(T1=1 or T2=1)then R1','采购金额' union all
select'P2','R1',1,'When(T1=1 or T2=1)then R1','买数量送数量' union all
select'P2','T1',0,'When(T1=1 or T2=1)then R1', '销售数量' union all
select'P2','T2',1,'When(T1=1 or T2=1)then R1','采购金额' union all
select'P3','R1',1,'When(T1=1 or T2=1)then R1','买数量送数量' union all
select'P3','T1',0,'When(T1=1 or T2=1)then R1', '销售数量' union all
select'P3','T2',0,'When(T1=1 or T2=1)then R1','采购金额'
)
SELECT *
FROM cet
...全文
307 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
道素 2016-01-26
  • 打赏
  • 举报
回复
我上面仅是一种思路,要完整解析必须参照产生数据是如何定义formula 你表中formula中的值应该不是随便写,肯定要有个书写规则,解析时要参考完整的规则,才能覆盖全部。 公式越复杂解析也越负责,所以如果能修改设计方案最好,比如我在我的项目中设计Promotion时,条件都是放在一个子表中,每一行是一个条件,解释将formula中的每项字符串都改为一个子表中的一行 如: 两种子表:一种是子表数据中存在任意一行即算满足(OR) 一种是必须所有条件都满足才算满足(AND) 那么在验证是就容易多了 你现在相当于在自己编写自己的动态语句执行器
Pact_Alice 2016-01-26
  • 打赏
  • 举报
回复
引用 16 楼 qq_17482963 的回复:
我是根据formula字段的判断生成结果再拼凑出sql语句,不知道你这个字段里的意思是不是成立就为Yes 否则就No
select * into #t1 from (
select 'P1'PromotionCode,'R1'ElementRelationCode,0IsConform,'When (T1=1 or T2=1)then R1'formula,'买数量送数量'DESC0 union all
select'P1','T1',1,'When(T1=1 or T2=1)then R1', '销售数量' union all
select'P1','T2',1,'When(T1=1 or T2=1)then R1','采购金额' union all
select'P2','R1',1,'When(T1=0 or T2=1)then R1','买数量送数量' union all
select'P2','T1',0,'When(T1=0 or T2=1)then R1', '销售数量' union all
select'P2','T2',1,'When(T1=0 or T2=1)then R1','采购金额' union all
select'P3','R1',1,'When(T1=1 or T2=1)then R1','买数量送数量' union all
select'P3','T1',0,'When(T1=1 or T2=1)then R1', '销售数量' union all
select'P3','T2',0,'When(T1=1 or T2=1)then R1','采购金额' 
) a

select * into #t2 from( 
select * from (select PromotionCode,ElementRelationCode,IsConform,replace(replace(formula,'R1','''Yes'''),'When','When PromotionCode='''+PromotionCode+''' and ')formula from #t1 where ElementRelationCode<>'R1') p pivot(max(IsConform) for ElementRelationCode in ([T1],[T2])) t
)a
declare @sql nvarchar(max),@col nvarchar(max)

select @col=ISNULL(@col+' ','case ')+formula from #t2

set @sql='
select a.*,b.P as DESC2 from #t1 a 
inner join (select PromotionCode,'+@col+' else ''No'' end P from #t2) b on a.PromotionCode=b.PromotionCode'
print @sql
exec(@sql)

drop table #t1
drop table #t2
--一:首先T与R的个数是不确定的,()表示的是组,[]表是的是T或者是R --逻辑还是一样,找formula中T对应的在IsConform,然后判断是否满足,满足表示Yes 不满足表示NO --二:现在最复杂的是(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))or([T2=1]=[R2])) --它表示满足(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))或者满足([T2=1]=[R2])) --因为它是()or()类型的 但是要先从左到右的规律 --如果(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))满足那么就是在P2所对应的[R1],[R3]是Yes ,不需要继续判断了直接[R2]是No --如果左边不满足在判断([T2=1]=[R2]))满足那么就是P2所对应的[R2]是Yes,不满足就是No --三:如果是(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))and([T2=1]=[R2])) --它表示()and() 从左到右 --如果(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))满足那么就是在P4所对应的[R1],[R3]是Yes 不满足就是NO --在继续判断([T2=1]=[R2])) 满足就是R2 Yes 不满足就是No -- ;WITH cet([PromotionCode], [ElementRelationCode], [IsConform], [formula], [DESC0]) AS ( SELECT N'P1' , N'R1', N'0', N'([T1=1]or[T2]=1)=[R1]', N'买数量送数量' union all SELECT N'P1', N'T1', N'1', N'([T1=1]or[T2]=1)=[R1]', N'销售数量'union all SELECT N'P1', N'T2', N'1', N'([T1=1]or[T2]=1)=[R1]', N'采购金额' union all SELECT N'P2', N'R1', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))or([T2=1]=[R2]))', N'买数量送数量'union all SELECT N'P2', N'R2', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))or([T2=1]=[R2]))', N'买数量送金额'union all SELECT N'P2', N'R3', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))or([T2=1]=[R2]))', N'买金额送金额'union all SELECT N'P2', N'T1', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))or([T2=1]=[R2]))', N'销售数量'union all SELECT N'P2', N'T2', N'1', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))or([T2=1]=[R2]))', N'采购金额'union all SELECT N'P2', N'T3', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))or([T2=1]=[R2]))', N'发票金额'union all SELECT N'P3', N'R1', N'0', N'[T1]=1=[R1]', N'买数量送金额'union all SELECT N'P3', N'T1', N'0', N'[T1]=1=[R1]', N'合同金额'union all SELECT N'P4', N'R1', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))and([T2=1]=[R2]))', N'买数量送数量'union all SELECT N'P4', N'R2', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))and([T2=1]=[R2]))', N'买数量送金额'union all SELECT N'P4', N'R3', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))and([T2=1]=[R2]))', N'买金额送金额'union all SELECT N'P4', N'T1', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))and([T2=1]=[R2]))', N'销售数量'union all SELECT N'P4', N'T2', N'1', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))and([T2=1]=[R2]))', N'采购金额'union all SELECT N'P4', N'T3', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))and([T2=1]=[R2]))', N'发票金额' ) SELECT * FROM cet --我都不知道您能不能明白我的意思,实在是太复杂了
Pact_Alice 2016-01-26
  • 打赏
  • 举报
回复
引用 15 楼 ch21st 的回复:
比如:

;WITH cet AS (	
select 'P1'PromotionCode,'R1'ElementRelationCode,0IsConform,'When(T1=1 or T2=1)then R1'formula,N'买数量送数量'DESC0 union all
select'P1','T1',1,'When(T1=1 or T2=1)then R1',	N'销售数量' union all
select'P1','T2',1,'When(T1=1 or T2=1)then R1',N'采购金额' union all
select'P2','R1',1,'When(T1=1 and T2=1)then R1',N'买数量送数量' union all	
select'P2','T1',0,'When(T1=1 and T2=1)then R1',	N'销售数量' union all
select'P2','T2',1,'When(T1=1 and T2=1)then R1',N'采购金额' union all
select'P3','R1',1,'When(T1=1 or T2=1)then R1',N'买数量送数量' union all	
select'P3','T1',0,'When(T1=1 or T2=1)then R1',	N'销售数量' union all
select'P3','T2',0,'When(T1=1 or T2=1)then R1',N'采购金额' 	
)
SELECT * INTO #a FROM cet

DECLARE @s VARCHAR(max)
SELECT @s=STUFF((
SELECT 'or (PromotionCode= '''+PromotionCode +''' and '+'('+replace(replace(replace(replace(replace(REPLACE(replace(REPLACE(formula,'When',''),'then R1',''),'=1',' and IsConform=1'),'=0',' and IsConform=0'),'T2',' ElementRelationCode=''t2'''),'T1','ElementRelationCode=''t1'''),' or ',') or ('),' and ',') and (')+')'
+') '
FROM #a GROUP BY PromotionCode, formula
FOR XML PATH('')),1,2,'')
  

SET @s='
SELECT a1.*,CASE WHEN aa.isExist IS NULL THEN ''No'' ELSE ''Yes'' END AS desc2 FROM #a AS a1
OUTER APPLY (SELECT TOP 1 1 AS isExist, * FROM #a AS a2 WHERE a2.PromotionCode=a1.PromotionCode AND a2.IsConform=1 
AND ('+ @s + ')) aa'
SELECT @s
  
EXEC(@s)
P2的条件改为 and,那么P2就变成不满足条件,返回的是No

PromotionCode	ElementRelationCode	IsConform	formula	DESC0	desc2
P1	R1	0	When(T1=1 or T2=1)then R1	买数量送数量	Yes
P1	T1	1	When(T1=1 or T2=1)then R1	销售数量	Yes
P1	T2	1	When(T1=1 or T2=1)then R1	采购金额	Yes
P2	R1	1	When(T1=1 and T2=1)then R1	买数量送数量	No
P2	T1	0	When(T1=1 and T2=1)then R1	销售数量	No
P2	T2	1	When(T1=1 and T2=1)then R1	采购金额	No
P3	R1	1	When(T1=1 or T2=1)then R1	买数量送数量	No
P3	T1	0	When(T1=1 or T2=1)then R1	销售数量	No
P3	T2	0	When(T1=1 or T2=1)then R1	采购金额	No
--一:首先T与R的个数是不确定的,()表示的是组,[]表是的是T或者是R --逻辑还是一样,找formula中T对应的在IsConform,然后判断是否满足,满足表示Yes 不满足表示NO --二:现在最复杂的是(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))or([T2=1]=[R2])) --它表示满足(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))或者满足([T2=1]=[R2])) --因为它是()or()类型的 但是要先从左到右的规律 --如果(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))满足那么就是在P2所对应的[R1],[R3]是Yes ,不需要继续判断了直接[R2]是No --如果左边不满足在判断([T2=1]=[R2]))满足那么就是P2所对应的[R2]是Yes,不满足就是No --三:如果是(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))and([T2=1]=[R2])) --它表示()and() 从左到右 --如果(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))满足那么就是在P4所对应的[R1],[R3]是Yes 不满足就是NO --在继续判断([T2=1]=[R2])) 满足就是R2 Yes 不满足就是No -- ;WITH cet([PromotionCode], [ElementRelationCode], [IsConform], [formula], [DESC0]) AS ( SELECT N'P1' , N'R1', N'0', N'([T1=1]or[T2]=1)=[R1]', N'买数量送数量' union all SELECT N'P1', N'T1', N'1', N'([T1=1]or[T2]=1)=[R1]', N'销售数量'union all SELECT N'P1', N'T2', N'1', N'([T1=1]or[T2]=1)=[R1]', N'采购金额' union all SELECT N'P2', N'R1', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))or([T2=1]=[R2]))', N'买数量送数量'union all SELECT N'P2', N'R2', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))or([T2=1]=[R2]))', N'买数量送金额'union all SELECT N'P2', N'R3', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))or([T2=1]=[R2]))', N'买金额送金额'union all SELECT N'P2', N'T1', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))or([T2=1]=[R2]))', N'销售数量'union all SELECT N'P2', N'T2', N'1', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))or([T2=1]=[R2]))', N'采购金额'union all SELECT N'P2', N'T3', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))or([T2=1]=[R2]))', N'发票金额'union all SELECT N'P3', N'R1', N'0', N'[T1]=1=[R1]', N'买数量送金额'union all SELECT N'P3', N'T1', N'0', N'[T1]=1=[R1]', N'合同金额'union all SELECT N'P4', N'R1', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))and([T2=1]=[R2]))', N'买数量送数量'union all SELECT N'P4', N'R2', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))and([T2=1]=[R2]))', N'买数量送金额'union all SELECT N'P4', N'R3', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))and([T2=1]=[R2]))', N'买金额送金额'union all SELECT N'P4', N'T1', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))and([T2=1]=[R2]))', N'销售数量'union all SELECT N'P4', N'T2', N'1', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))and([T2=1]=[R2]))', N'采购金额'union all SELECT N'P4', N'T3', N'0', N'(([T1=1]and([T2=1]or[T3=1])=([R1]AND[R3]))and([T2=1]=[R2]))', N'发票金额' ) SELECT * FROM cet --我都不知道您能不能明白我的意思,实在是太复杂了
qq_17482963 2016-01-26
  • 打赏
  • 举报
回复
我是根据formula字段的判断生成结果再拼凑出sql语句,不知道你这个字段里的意思是不是成立就为Yes 否则就No
select * into #t1 from (
select 'P1'PromotionCode,'R1'ElementRelationCode,0IsConform,'When (T1=1 or T2=1)then R1'formula,'买数量送数量'DESC0 union all
select'P1','T1',1,'When(T1=1 or T2=1)then R1', '销售数量' union all
select'P1','T2',1,'When(T1=1 or T2=1)then R1','采购金额' union all
select'P2','R1',1,'When(T1=0 or T2=1)then R1','买数量送数量' union all
select'P2','T1',0,'When(T1=0 or T2=1)then R1', '销售数量' union all
select'P2','T2',1,'When(T1=0 or T2=1)then R1','采购金额' union all
select'P3','R1',1,'When(T1=1 or T2=1)then R1','买数量送数量' union all
select'P3','T1',0,'When(T1=1 or T2=1)then R1', '销售数量' union all
select'P3','T2',0,'When(T1=1 or T2=1)then R1','采购金额' 
) a

select * into #t2 from( 
select * from (select PromotionCode,ElementRelationCode,IsConform,replace(replace(formula,'R1','''Yes'''),'When','When PromotionCode='''+PromotionCode+''' and ')formula from #t1 where ElementRelationCode<>'R1') p pivot(max(IsConform) for ElementRelationCode in ([T1],[T2])) t
)a
declare @sql nvarchar(max),@col nvarchar(max)

select @col=ISNULL(@col+' ','case ')+formula from #t2

set @sql='
select a.*,b.P as DESC2 from #t1 a 
inner join (select PromotionCode,'+@col+' else ''No'' end P from #t2) b on a.PromotionCode=b.PromotionCode'
print @sql
exec(@sql)

drop table #t1
drop table #t2
道素 2016-01-26
  • 打赏
  • 举报
回复
比如:

;WITH cet AS (	
select 'P1'PromotionCode,'R1'ElementRelationCode,0IsConform,'When(T1=1 or T2=1)then R1'formula,N'买数量送数量'DESC0 union all
select'P1','T1',1,'When(T1=1 or T2=1)then R1',	N'销售数量' union all
select'P1','T2',1,'When(T1=1 or T2=1)then R1',N'采购金额' union all
select'P2','R1',1,'When(T1=1 and T2=1)then R1',N'买数量送数量' union all	
select'P2','T1',0,'When(T1=1 and T2=1)then R1',	N'销售数量' union all
select'P2','T2',1,'When(T1=1 and T2=1)then R1',N'采购金额' union all
select'P3','R1',1,'When(T1=1 or T2=1)then R1',N'买数量送数量' union all	
select'P3','T1',0,'When(T1=1 or T2=1)then R1',	N'销售数量' union all
select'P3','T2',0,'When(T1=1 or T2=1)then R1',N'采购金额' 	
)
SELECT * INTO #a FROM cet

DECLARE @s VARCHAR(max)
SELECT @s=STUFF((
SELECT 'or (PromotionCode= '''+PromotionCode +''' and '+'('+replace(replace(replace(replace(replace(REPLACE(replace(REPLACE(formula,'When',''),'then R1',''),'=1',' and IsConform=1'),'=0',' and IsConform=0'),'T2',' ElementRelationCode=''t2'''),'T1','ElementRelationCode=''t1'''),' or ',') or ('),' and ',') and (')+')'
+') '
FROM #a GROUP BY PromotionCode, formula
FOR XML PATH('')),1,2,'')
  

SET @s='
SELECT a1.*,CASE WHEN aa.isExist IS NULL THEN ''No'' ELSE ''Yes'' END AS desc2 FROM #a AS a1
OUTER APPLY (SELECT TOP 1 1 AS isExist, * FROM #a AS a2 WHERE a2.PromotionCode=a1.PromotionCode AND a2.IsConform=1 
AND ('+ @s + ')) aa'
SELECT @s
  
EXEC(@s)
P2的条件改为 and,那么P2就变成不满足条件,返回的是No

PromotionCode	ElementRelationCode	IsConform	formula	DESC0	desc2
P1	R1	0	When(T1=1 or T2=1)then R1	买数量送数量	Yes
P1	T1	1	When(T1=1 or T2=1)then R1	销售数量	Yes
P1	T2	1	When(T1=1 or T2=1)then R1	采购金额	Yes
P2	R1	1	When(T1=1 and T2=1)then R1	买数量送数量	No
P2	T1	0	When(T1=1 and T2=1)then R1	销售数量	No
P2	T2	1	When(T1=1 and T2=1)then R1	采购金额	No
P3	R1	1	When(T1=1 or T2=1)then R1	买数量送数量	No
P3	T1	0	When(T1=1 or T2=1)then R1	销售数量	No
P3	T2	0	When(T1=1 or T2=1)then R1	采购金额	No
道素 2016-01-26
  • 打赏
  • 举报
回复
我还弄完就提交了 你在上面语句中再加上 replace(s,' and ',' ) and (')
道素 2016-01-26
  • 打赏
  • 举报
回复

DECLARE @s VARCHAR(max)
SELECT @s=STUFF((
SELECT 'or (PromotionCode= '''+PromotionCode +''' and '+'('+replace(replace(replace(replace(REPLACE(replace(REPLACE(formula,'When',''),'then R1',''),'=1',' and IsConform=1'),'=0',' and IsConform=0'),'T2',' ElementRelationCode=''t2'''),'T1','ElementRelationCode=''t1'''),' or ',') or (')+')'
+') '
FROM #a GROUP BY PromotionCode, formula
FOR XML PATH('')),1,2,'')
 
 
 
SET @s='
SELECT *,CASE WHEN aa.isExist IS NULL THEN ''No'' ELSE ''Yes'' END AS desc2 FROM #a AS a1
OUTER APPLY (SELECT TOP 1 1 AS isExist, * FROM #a AS a2 WHERE a2.PromotionCode=a1.PromotionCode AND a2.IsConform=1 
AND ('+ @s + ')) aa'
SELECT @s
 
EXEC(@s)
Pact_Alice 2016-01-26
  • 打赏
  • 举报
回复
引用 8 楼 ch21st 的回复:
把固定写死的AND a2.IsConform=1 去掉,在组合条件时已经考虑它可能为0的情况了,如果有and和or类似 组合好应该:

SELECT *,
       CASE 
            WHEN aa.isExist IS NULL THEN 'No'
            ELSE 'Yes'
       END  AS desc2
FROM   #a   AS a1
       OUTER APPLY (
    SELECT TOP 1 1  AS isExist,
           *
    FROM   #a       AS a2
    WHERE  a2.PromotionCode = a1.PromotionCode
           AND (
                   (
                       PromotionCode = 'P1'
                       AND (
                               (ElementRelationCode = 't1' AND IsConform = 1)
                               OR (ElementRelationCode = 't2' AND IsConform = 1)
                           )
                   )
                   OR (
                          PromotionCode = 'P2'
                          AND (
                                  (ElementRelationCode = 't1' AND IsConform = 1)
                                  OR (ElementRelationCode = 't2' AND IsConform = 1)
                              )
                      )
                   OR (
                          PromotionCode = 'P3'
                          AND (
                                  (ElementRelationCode = 't1' AND IsConform = 1)
                                  OR (ElementRelationCode = 't2' AND IsConform = 1)
                              )
                      )
               )
) aa

看了您的回复,最主要的一点是我formula这个规则不是固定就是T1orT2的,有可能是T1andT2 ,还有可能是是动态的
Pact_Alice 2016-01-26
  • 打赏
  • 举报
回复
引用 10 楼 wtujedp 的回复:
[quote=引用 9 楼 Landa_Alice 的回复:] 就没人在继续回答了吗
http://bbs.csdn.net/topics/370013493 帮你查了一下,你看这个是不是你要的?[/quote]刚刚看了一下,这个不是的呢
Pact_Alice 2016-01-26
  • 打赏
  • 举报
回复
引用 19 楼 ch21st 的回复:
我上面仅是一种思路,要完整解析必须参照产生数据是如何定义formula 你表中formula中的值应该不是随便写,肯定要有个书写规则,解析时要参考完整的规则,才能覆盖全部。 公式越复杂解析也越负责,所以如果能修改设计方案最好,比如我在我的项目中设计Promotion时,条件都是放在一个子表中,每一行是一个条件,解释将formula中的每项字符串都改为一个子表中的一行 如: 两种子表:一种是子表数据中存在任意一行即算满足(OR) 一种是必须所有条件都满足才算满足(AND) 那么在验证是就容易多了 你现在相当于在自己编写自己的动态语句执行器
我现在让程序做了,没有办法处理
Pact_Alice 2016-01-25
  • 打赏
  • 举报
回复
引用 4 楼 wtujedp 的回复:
明白了,你这个是p1,p2,p3是三组数据。
您有什么方法解决这个问题呢
Pact_Alice 2016-01-25
  • 打赏
  • 举报
回复
引用 4 楼 wtujedp 的回复:
明白了,你这个是p1,p2,p3是三组数据。
是的呢
wtujedp 2016-01-25
  • 打赏
  • 举报
回复
引用 9 楼 Landa_Alice 的回复:
就没人在继续回答了吗
http://bbs.csdn.net/topics/370013493 帮你查了一下,你看这个是不是你要的?
wtujedp 2016-01-25
  • 打赏
  • 举报
回复
明白了,你这个是p1,p2,p3是三组数据。
Pact_Alice 2016-01-25
  • 打赏
  • 举报
回复
引用 2 楼 wtujedp 的回复:
看不懂题目,心好累
描述的不够清楚吗,我就是想将Formula 中T 替换成 ElementRelationCode对应的IsConform,比如第一行吧,Formula 是(T1=1 or T2=1 )在列ElementRelationCode中T1 对应的IsConform是1 T2 对应的也是 1 ,那么就是成立的 Formula(T1=1 or T2=1 )是成立的,所以就是Yes
wtujedp 2016-01-25
  • 打赏
  • 举报
回复
看不懂题目,心好累
Pact_Alice 2016-01-25
  • 打赏
  • 举报
回复
Pact_Alice 2016-01-25
  • 打赏
  • 举报
回复
就没人在继续回答了吗
道素 2016-01-25
  • 打赏
  • 举报
回复
把固定写死的AND a2.IsConform=1 去掉,在组合条件时已经考虑它可能为0的情况了,如果有and和or类似 组合好应该:

SELECT *,
       CASE 
            WHEN aa.isExist IS NULL THEN 'No'
            ELSE 'Yes'
       END  AS desc2
FROM   #a   AS a1
       OUTER APPLY (
    SELECT TOP 1 1  AS isExist,
           *
    FROM   #a       AS a2
    WHERE  a2.PromotionCode = a1.PromotionCode
           AND (
                   (
                       PromotionCode = 'P1'
                       AND (
                               (ElementRelationCode = 't1' AND IsConform = 1)
                               OR (ElementRelationCode = 't2' AND IsConform = 1)
                           )
                   )
                   OR (
                          PromotionCode = 'P2'
                          AND (
                                  (ElementRelationCode = 't1' AND IsConform = 1)
                                  OR (ElementRelationCode = 't2' AND IsConform = 1)
                              )
                      )
                   OR (
                          PromotionCode = 'P3'
                          AND (
                                  (ElementRelationCode = 't1' AND IsConform = 1)
                                  OR (ElementRelationCode = 't2' AND IsConform = 1)
                              )
                      )
               )
) aa

道素 2016-01-25
  • 打赏
  • 举报
回复
你这里要动态解析公式,所以首先要考虑使用动态语句,我试着写了一个供参考,但应该还不满足你的需要,你的公式实际用该更复杂,我构造的出的不是最理想的,还可以继续优化

DECLARE @s VARCHAR(max)
SELECT @s=STUFF((
SELECT 'or (PromotionCode= '''+PromotionCode +''' and '+'('+replace(replace(replace(replace(REPLACE(replace(REPLACE(formula,'When',''),'then R1',''),'=1',' and IsConform=1'),'=0',' and IsConform=0'),'T2',' ElementRelationCode=''t2'''),'T1','ElementRelationCode=''t1'''),' or ',') or (')+')'
+') '
FROM #a GROUP BY PromotionCode, formula
FOR XML PATH('')),1,2,'')



SET @s='
SELECT *,CASE WHEN aa.isExist IS NULL THEN ''No'' ELSE ''Yes'' END AS desc2 FROM #a AS a1
OUTER APPLY (SELECT TOP 1 1 AS isExist, * FROM #a AS a2 WHERE a2.PromotionCode=a1.PromotionCode AND a2.IsConform=1 
AND ('+ @s + ')) aa'
SELECT @s

EXEC(@s)

构造的语句是:


SELECT *,CASE WHEN aa.isExist IS NULL THEN 'No' ELSE 'Yes' END AS desc2 FROM #a AS a1
OUTER APPLY (SELECT TOP 1 1 AS isExist, * FROM #a AS a2 WHERE a2.PromotionCode=a1.PromotionCode AND a2.IsConform=1 
AND ( (PromotionCode= 'P1' and ((ElementRelationCode='t1' and IsConform=1) or ( ElementRelationCode='t2' and IsConform=1))) or (PromotionCode= 'P2' and ((ElementRelationCode='t1' and IsConform=1) or ( ElementRelationCode='t2' and IsConform=1))) or (PromotionCode= 'P3' and ((ElementRelationCode='t1' and IsConform=1) or ( ElementRelationCode='t2' and IsConform=1))) )) aa

34,576

社区成员

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

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