两条SQL语句合并 解决立马解帖

happy664618843 2016-08-05 02:19:46
insert into #ASB_SQLCountValueInfo(UserConnectionCounterID,UserConnectionDateTime,UserConnectionCounterValue
,BlockedCounterID,BlockedCounterDateTime,BlockedCounterValue)
select UserConnectionCounterID,UserConnectionDateTime,UserConnectionCounterValue
,BlockedCounterID,BlockedCounterDateTime,BlockedCounterValue from --合并后数据

--需要实现下面两条SQL合并成一条。以下两条sql只有CounterName的条件查询值不一样。其它条件都一样


exec ('select CounterID as UserConnectionCounterID,CounterDateTime as UserConnectionDateTime, CounterValue as UserConnectionCounterValue from dbo.ASBSQL_PerformanceCounterDetailM6 T
where CounterID in (
select CounterID from [SQLMonitor].[dbo].[ASBSQL_PerformanceCounterList]
where ServerName=''cnshjssql14.ad4.ad.alcatel.com'' and CounterName=''User Connections'')
and T.CounterValue>0 and DATEDIFF(MINUTE,CounterDateTime,GETDATE())>=30
order by CounterDateTime desc')

exec (' select CounterID as BlockedCounterID,CounterDateTime as BlockedCounterDateTime, CounterValue as BlockedCounterValue from dbo.ASBSQL_PerformanceCounterDetailM6 T
where CounterID in (
select CounterID from [SQLMonitor].[dbo].[ASBSQL_PerformanceCounterList]
where ServerName=''cnshjssql14.ad4.ad.alcatel.com'' and CounterName=''Processes blocked''
)
and isnull(T.CounterValue,0)>0 and DATEDIFF(MINUTE,CounterDateTime,GETDATE())>=30
order by CounterDateTime desc' )
...全文
620 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
happy664618843 2016-08-10
  • 打赏
  • 举报
回复
引用 36 楼 roy_88 的回复:
看一下我上面贴的连接,学习一下怎样提问 看不懂你的逻辑,只能猜一个,按显示顺序关联
EXEC('WITH CTEUser
AS
(
SELECT  CounterID AS UserConnectionCounterID
       ,CounterDateTime AS UserConnectionDateTime
       ,CounterValue AS UserConnectionCounterValue
	   ,ROW_NUMBER()OVER(ORDER BY CounterDateTime DESC) AS RN
FROM    dbo.ASBSQL_PerformanceCounterDetailM6 T
WHERE   CounterID IN (
        SELECT  CounterID
        FROM    [SQLMonitor].[dbo].[ASBSQL_PerformanceCounterList]
        WHERE   ServerName = ''cnshjssql14.ad4.ad.alcatel.com''
                AND CounterName = ''User Connections'' )
        AND T.CounterValue > 0
        AND DATEDIFF(MINUTE , CounterDateTime , GETDATE()) >= 30
),CTEBlocked
AS
(
SELECT  CounterID AS BlockedCounterID
       ,CounterDateTime AS BlockedCounterDateTime
       ,CounterValue AS BlockedCounterValue
	   ,ROW_NUMBER()OVER(ORDER BY CounterDateTime DESC) AS RN
FROM    dbo.ASBSQL_PerformanceCounterDetailM6 T
WHERE   CounterID IN (
        SELECT  CounterID
        FROM    [SQLMonitor].[dbo].[ASBSQL_PerformanceCounterList]
        WHERE   ServerName = ''cnshjssql14.ad4.ad.alcatel.com''
                AND CounterName = ''Processes blocked'' )
        AND ISNULL(T.CounterValue , 0) > 0
        AND DATEDIFF(MINUTE , CounterDateTime , GETDATE()) >= 30
)
SELECT  a.UserConnectionCounterID
       ,a.UserConnectionDateTime
       ,a.UserConnectionCounterValue
       ,b.BlockedCounterID
       ,b.BlockedCounterDateTime
       ,b.BlockedCounterValue 
FROM CTEUser AS a 
	INNER JOIN CTEBlocked AS b ON a.RN=b.RN
WHERE  (b.BlockedCounterValue/a.UserConnectionCounterValue)*100>20 ')
我己通过以下方法解决:
	    insert into #ASB_SQLCountValueInfo(CounterDateTime, BlockedCounterValue,UserConnectionCounterValue)
	    exec('select  CounterDateTime,ProcessblockedValue,UserConnectionValue from 
	    (
			select  A.CounterDateTime, 
			ProcessblockedValue=MAX(case when T.CounterName=''Processes blocked'' then A.CounterValue ELSE 0 END),
			UserConnectionValue=MAX(case when T.CounterName=''User Connections'' then A.CounterValue ELSE 0 END)
			from ASBSQL_PerformanceCounterDetailM'+@NowMonth+' A
			inner join ASBSQL_PerformanceCounterList T 
			on A.CounterID=T.CounterID
			where T.ServerName='''+@serverName+'''
			and T.CounterName in (''Processes blocked'',''User Connections'')
			group by A.CounterDateTime
		) B
		where B.ProcessblockedValue>0 
		order by CounterDateTime desc'
		)
中国风 2016-08-08
  • 打赏
  • 举报
回复
引用 33 楼 happy664618843 的回复:
不相同的CounterID通过什么逻辑显示成同一行,这样你能明白 UserConnetionCounterID BlockCounterID UserConnetionCountValue BlockCounterValue 1 5 80 50 2 7 120 100
happy664618843 2016-08-08
  • 打赏
  • 举报
回复
引用 32 楼 roy_88 的回复:
你根本都不知道我在讲什么

你要这样的显示,你的原始数据 是?

看你的结果两个结果没有任何联接方法,你这是笛卡尔集,结果是拼出来的没有意义


看你拼出来的结果集通过UserConnetionCounterID 大小 关系顺序?

详细表:

原始表:
中国风 2016-08-08
  • 打赏
  • 举报
回复
你根本都不知道我在讲什么 你要这样的显示,你的原始数据 是? 看你的结果两个结果没有任何联接方法,你这是笛卡尔集,结果是拼出来的没有意义 看你拼出来的结果集通过UserConnetionCounterID 大小 关系顺序?
xiaoxiangqing 2016-08-08
  • 打赏
  • 举报
回复
UNION ALL或者UNION
happy664618843 2016-08-08
  • 打赏
  • 举报
回复
引用 29 楼 happy664618843 的回复:
[quote=引用 25 楼 roy_88 的回复:]
把条件改为以下,过滤条件满足UserConnectionCounterValue《=0的情况
UserConnectionCounterValue>0 AND (BlockedCounterValue/UserConnectionCounterValue)*100>20


你好,我加上 UserConnectionCounterValue>0[/color] AND (BlockedCounterValue/UserConnectionCounterValue)*100>20 条件
查询出来的结果为空。[/quote]
happy664618843 2016-08-08
  • 打赏
  • 举报
回复
引用 25 楼 roy_88 的回复:
把条件改为以下,过滤条件满足UserConnectionCounterValue《=0的情况 UserConnectionCounterValue>0 AND (BlockedCounterValue/UserConnectionCounterValue)*100>20
你好,我加上 UserConnectionCounterValue>0[/color] AND (BlockedCounterValue/UserConnectionCounterValue)*100>20 条件 查询出来的结果为空。
xiaosong96 2016-08-08
  • 打赏
  • 举报
回复
厉害,学习了
happy664618843 2016-08-08
  • 打赏
  • 举报
回复
引用 26 楼 roy_88 的回复:
CounterID是不一样?可以不根据CounterID分组吗? ----------------- 不一样通过什么栏位合并?你自己都讲不清楚逻辑没人能帮到你 首先说清楚自己的逻辑,或列出的你模拟数据和要的效果给你看看有没有办法实现 没逻辑的功能拼出来的结果是没有意义的
引用 26 楼 roy_88 的回复:
CounterID是不一样?可以不根据CounterID分组吗? ----------------- 不一样通过什么栏位合并?你自己都讲不清楚逻辑没人能帮到你 首先说清楚自己的逻辑,或列出的你模拟数据和要的效果给你看看有没有办法实现 没逻辑的功能拼出来的结果是没有意义的
谢谢! 我想实现查询出来的数据的效果如下: UserConnetionCounterID BlockCounterID UserConnetionCountValue BlockCounterValue 1 5 80 50 2 7 120 100 ............................... 然后把查询出来的结果插入到tbTempCountValueInfo表中.然后在tbTempCountValueInfo表中判断如下条件: if exists (BlockCounterValue /UserConnetionCountValue )*100>20 开始发送邮件提醒
中国风 2016-08-08
  • 打赏
  • 举报
回复
看一下我上面贴的连接,学习一下怎样提问 看不懂你的逻辑,只能猜一个,按显示顺序关联
EXEC('WITH CTEUser
AS
(
SELECT  CounterID AS UserConnectionCounterID
       ,CounterDateTime AS UserConnectionDateTime
       ,CounterValue AS UserConnectionCounterValue
	   ,ROW_NUMBER()OVER(ORDER BY CounterDateTime DESC) AS RN
FROM    dbo.ASBSQL_PerformanceCounterDetailM6 T
WHERE   CounterID IN (
        SELECT  CounterID
        FROM    [SQLMonitor].[dbo].[ASBSQL_PerformanceCounterList]
        WHERE   ServerName = ''cnshjssql14.ad4.ad.alcatel.com''
                AND CounterName = ''User Connections'' )
        AND T.CounterValue > 0
        AND DATEDIFF(MINUTE , CounterDateTime , GETDATE()) >= 30
),CTEBlocked
AS
(
SELECT  CounterID AS BlockedCounterID
       ,CounterDateTime AS BlockedCounterDateTime
       ,CounterValue AS BlockedCounterValue
	   ,ROW_NUMBER()OVER(ORDER BY CounterDateTime DESC) AS RN
FROM    dbo.ASBSQL_PerformanceCounterDetailM6 T
WHERE   CounterID IN (
        SELECT  CounterID
        FROM    [SQLMonitor].[dbo].[ASBSQL_PerformanceCounterList]
        WHERE   ServerName = ''cnshjssql14.ad4.ad.alcatel.com''
                AND CounterName = ''Processes blocked'' )
        AND ISNULL(T.CounterValue , 0) > 0
        AND DATEDIFF(MINUTE , CounterDateTime , GETDATE()) >= 30
)
SELECT  a.UserConnectionCounterID
       ,a.UserConnectionDateTime
       ,a.UserConnectionCounterValue
       ,b.BlockedCounterID
       ,b.BlockedCounterDateTime
       ,b.BlockedCounterValue 
FROM CTEUser AS a 
	INNER JOIN CTEBlocked AS b ON a.RN=b.RN
WHERE  (b.BlockedCounterValue/a.UserConnectionCounterValue)*100>20 ')
happy664618843 2016-08-08
  • 打赏
  • 举报
回复

通过CounterName来显示。CounterID来关联。
中国风 2016-08-06
  • 打赏
  • 举报
回复
用以下脚本看看效果

exec ('
SELECT UserConnectionCounterID,UserConnectionDateTime,UserConnectionCounterValue,BlockedCounterValue
FROM 
(SELECT  T1.CounterID AS UserConnectionCounterID ,
        T1.CounterDateTime AS UserConnectionDateTime ,
        MAX(CASE WHEN T2.CounterName = ''User Connections'' THEN T1.CounterValue
                 ELSE 0
            END) AS UserConnectionCounterValue ,
        MAX(CASE WHEN T2.CounterName = ''Processes blocked''
                 THEN T1.CounterValue
                 ELSE 0
            END) AS BlockedCounterValue
FROM    dbo.ASBSQL_PerformanceCounterDetailM6 T1
        INNER JOIN ( SELECT  DISTINCT
                            CounterID ,
                            CounterName
                     FROM   [SQLMonitor].[dbo].[ASBSQL_PerformanceCounterList]
                     WHERE  ServerName = ''cnshjssql14.ad4.ad.alcatel.com''
                            AND CounterName IN ( ''User Connections'',
                                                 ''Processes blocked'' )
                   ) AS T2 ON T1.CounterID = T2.CounterID
WHERE   T1.CounterValue > 0
        AND DATEDIFF(MINUTE, T1.CounterDateTime, GETDATE()) >= 30
GROUP BY T1.CounterID ,
        T1.CounterDateTime
) AS T
WHERE (BlockedCounterValue/ISNULL(NULLIF(UserConnectionCounterValue,0),1))*100>20
ORDER BY T1.UserConnectionDateTime DESC;')
中国风 2016-08-06
  • 打赏
  • 举报
回复
不提示被0除可用#16楼方法 把条件改为 BlockedCounterValue>UserConnectionCounterValue*0.2
中国风 2016-08-06
  • 打赏
  • 举报
回复
CounterID是不一样?可以不根据CounterID分组吗? ----------------- 不一样通过什么栏位合并?你自己都讲不清楚逻辑没人能帮到你 首先说清楚自己的逻辑,或列出的你模拟数据和要的效果给你看看有没有办法实现 没逻辑的功能拼出来的结果是没有意义的
中国风 2016-08-06
  • 打赏
  • 举报
回复
把条件改为以下,过滤条件满足UserConnectionCounterValue《=0的情况 UserConnectionCounterValue>0 AND (BlockedCounterValue/UserConnectionCounterValue)*100>20
happy664618843 2016-08-06
  • 打赏
  • 举报
回复
CounterID是不一样?可以不根据CounterID分组吗? 我想查询出来的结果如下:并且UserConnetionCountValue 和BlockCounterValue 都不为0。 UserConnetionCounterID BlockCounterID UserConnetionCountValue BlockCounterValue 1 5 80 50 2 7 120 100 ...............................
happy664618843 2016-08-06
  • 打赏
  • 举报
回复
[quote=引用 22 楼 roy_88 的回复:]
不提示被0除可用#16楼方法
把条件改为
BlockedCounterValue>UserConnectionCounterValue*0.2[/quote
我用#21的方法查询出来的结果

但UserConneCounterValue的值有为0的情况。
CounterID是不一样。

有没有方法可以实现下面结果??:我想查询出来UserConnetionCountValue 和 BlockCounterValue 都没有为0的情况。如果有一个为0就没有相除的意义了

UserConnetionCounterID BlockCounterID UserConnetionCountValue BlockCounterValue
1 5 80 50
2 7 120 100
...............................
查询 出来的结果插入到tbTempCountValueInfo表中.然后在tbTempCountValueInfo表中判断如下条件:
if exists (BlockCounterValue /UserConnetionCountValue )*100>20
开始发送邮件提醒


中国风 2016-08-05
  • 打赏
  • 举报
回复
(BlockedCounterValue/UserConnectionCounterValue)*100>20(单位:百分比) UserConnectionCounterValue=0时成立还是不成立,你直接用被0除会报错
happy664618843 2016-08-05
  • 打赏
  • 举报
回复
引用 18 楼 happy664618843 的回复:
[quote=引用 16 楼 roy_88 的回复:] BlockedCounterValue/UserConnectionCounterValue*100>20--你这条件感觉上有问题 注意整数和小数类型会影响结果集:3/2=1 / 3.0/2=1.5 --用以下方法试试 BlockedCounterValue>UserConnectionCounterValue*2000

exec ('
SELECT UserConnectionCounterID,UserConnectionDateTime,UserConnectionCounterValue,BlockedCounterValue
FROM 
(SELECT  T1.CounterID AS UserConnectionCounterID ,
        T1.CounterDateTime AS UserConnectionDateTime ,
        MAX(CASE WHEN T2.CounterName = ''User Connections'' THEN T1.CounterValue
                 ELSE 0
            END) AS UserConnectionCounterValue ,
        MAX(CASE WHEN T2.CounterName = ''Processes blocked''
                 THEN T1.CounterValue
                 ELSE 0
            END) AS BlockedCounterValue
FROM    dbo.ASBSQL_PerformanceCounterDetailM6 T1
        INNER JOIN ( SELECT  DISTINCT
                            CounterID ,
                            CounterName
                     FROM   [SQLMonitor].[dbo].[ASBSQL_PerformanceCounterList]
                     WHERE  ServerName = ''cnshjssql14.ad4.ad.alcatel.com''
                            AND CounterName IN ( ''User Connections'',
                                                 ''Processes blocked'' )
                   ) AS T2 ON T1.CounterID = T2.CounterID
WHERE   T1.CounterValue > 0
        AND DATEDIFF(MINUTE, T1.CounterDateTime, GETDATE()) >= 30
GROUP BY T1.CounterID ,
        T1.CounterDateTime
) AS T
WHERE BlockedCounterValue>UserConnectionCounterValue*2000
ORDER BY T1.UserConnectionDateTime DESC;')
你好 是我没有写对 不好意思 ,我想表达是 (BlockedCounterValue/UserConnectionCounterValue)*100>20(单位:百分比)- 请问咱解决? 谢谢!非常感谢 [/quote] WHERE BlockedCounterValue>UserConnectionCounterValue*2000 这个条件不能在这里加。 我现在主要目的是想合并结果集生成想要数据.插入到数据表。数据表(tbCounterVauleInfo)展示结果如下所示: eg: BlockedCounterValue UserConnectionCounterValue CounterDatetime 11 4 2016---.... 33 7 ...... ........ 等所有数据插入到tbCounterVauleInfo中后,接下来就是从这个表中判断 有没有(BlockedCounterValue/UserConnectionCounterValue)*100>20(单位:百分比) 数据 如果有 则发送邮件.
happy664618843 2016-08-05
  • 打赏
  • 举报
回复
引用 16 楼 roy_88 的回复:
BlockedCounterValue/UserConnectionCounterValue*100>20--你这条件感觉上有问题 注意整数和小数类型会影响结果集:3/2=1 / 3.0/2=1.5 --用以下方法试试 BlockedCounterValue>UserConnectionCounterValue*2000

exec ('
SELECT UserConnectionCounterID,UserConnectionDateTime,UserConnectionCounterValue,BlockedCounterValue
FROM 
(SELECT  T1.CounterID AS UserConnectionCounterID ,
        T1.CounterDateTime AS UserConnectionDateTime ,
        MAX(CASE WHEN T2.CounterName = ''User Connections'' THEN T1.CounterValue
                 ELSE 0
            END) AS UserConnectionCounterValue ,
        MAX(CASE WHEN T2.CounterName = ''Processes blocked''
                 THEN T1.CounterValue
                 ELSE 0
            END) AS BlockedCounterValue
FROM    dbo.ASBSQL_PerformanceCounterDetailM6 T1
        INNER JOIN ( SELECT  DISTINCT
                            CounterID ,
                            CounterName
                     FROM   [SQLMonitor].[dbo].[ASBSQL_PerformanceCounterList]
                     WHERE  ServerName = ''cnshjssql14.ad4.ad.alcatel.com''
                            AND CounterName IN ( ''User Connections'',
                                                 ''Processes blocked'' )
                   ) AS T2 ON T1.CounterID = T2.CounterID
WHERE   T1.CounterValue > 0
        AND DATEDIFF(MINUTE, T1.CounterDateTime, GETDATE()) >= 30
GROUP BY T1.CounterID ,
        T1.CounterDateTime
) AS T
WHERE BlockedCounterValue>UserConnectionCounterValue*2000
ORDER BY T1.UserConnectionDateTime DESC;')
你好 是我没有写对 不好意思 ,我想表达是 (BlockedCounterValue/UserConnectionCounterValue)*100>20(单位:百分比)- 请问咱解决? 谢谢!非常感谢
加载更多回复(17)

34,587

社区成员

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

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