一次返回多个动态选择查询

Posted

技术标签:

【中文标题】一次返回多个动态选择查询【英文标题】:Multiple Dynamic Selects queries in one return 【发布时间】:2015-09-10 09:33:24 【问题描述】:

我需要运行多个选择计数查询来计算一天中特定时间有多少人可用,以便从 ms sql server 绘制到表中。

我有下面的 sql 可以工作,但是将每个计数作为一个新表返回,我希望它们都在不同列的一个表中。

DECLARE @Day varchar(max)
SET @Day = 'Sunday' 

DECLARE @Provider varchar(max)
SET @Provider = '58611'


DECLARE @sqlText varchar(max); 

SET @sqlText = N'SELECT COUNT(*) AS Available0700 
  FROM tblCarersRota INNER JOIN tblCarersProviders ON tblCarersProviders.CarerID = tblCarersRota.CarerID
  WHERE Rotation = 2 AND  tblCarersProviders.ProviderID = '''+ @Provider + ''' AND ''07:00'' between ' + @Day + 'StartTime AND ' + @Day + 'EndTime  '
Exec (@sqlText)

SET @sqlText = N'SELECT COUNT(*) AS Available0800 
  FROM tblCarersRota INNER JOIN tblCarersProviders ON tblCarersProviders.CarerID = tblCarersRota.CarerID
  WHERE Rotation = 2 AND  tblCarersProviders.ProviderID = '''+ @Provider + ''' AND ''08:00'' between ' + @Day + 'StartTime AND ' + @Day + 'EndTime  '
Exec (@sqlText)

当前实际结果:

Available0700
21


Available0800
22

想要的结果:

Available0700 || Available0800   
21            || 22

我查看了您选择的位置(选择查询 1)(选择查询 2),但我无法让它与动态 sqltext 一起使用。

如何修改我的选择以使它们全部返回为 1 个表?

谢谢

【问题讨论】:

我尝试了一个 union all 并在一个名为 Available0700 的列中恢复了两个计数值,它从未进入第二列 【参考方案1】:

选项1,用UNION ALL把它分成2行:

SELECT COUNT(*) as Counts, 'Available0700' AvailableTime
FROM ...
UNION all
SELECT COUNT(*) as Counts, 'Available0800' AvailableTime
FROM ...

选项 2,在 2 列中包含子查询:

SELECT (SELECT COUNT(*) FROM ...) as Available0700,
       (SELECT COUNT(*) FROM ...) as Available0800

【讨论】:

我已经尝试了这两种方法 - 选项 1 将所有计数重新放在一列中(请参阅我对问题的评论)选项 2 我无法开始工作,因为我必须使用动态sql @JoshCooper 选项 1 旨在将其显示为答案中指定的 2 行。选项2,您只需将您的动态sql放在括号中的子查询中并执行一次。 感谢您解释我哪里出错了,选项 2 现在完美运行【参考方案2】:

我认为您可以将这些值存储在变量中,最后在您的选择查询中选择这些变量。

下面是一个示例代码,其中我使用表变量来执行动态查询并存储记录,最后使用 PIVOT 查询来获取所需的输出。

DECLARE @tablevar TABLE
(
    Query VARCHAR(100),
    Cnt INT
)
DECLARE @sqlText varchar(max)
SET @sqlText = N'SELECT ''Available Value 1'', 100 '
INSERT INTO @tablevar
Exec (@sqlText)


SET @sqlText = N'SELECT ''Available Value 2'', 200 '
INSERT INTO @tablevar
Exec (@sqlText)


SET @sqlText = N'SELECT ''Available Value 3'', 300 '
INSERT INTO @tablevar
Exec (@sqlText)

SELECT * FROM @tablevar 
PIVOT(SUM(Cnt) FOR Query IN([Available Value 1], [Available Value 2], [Available Value 3])) AS PIV

以上代码为示例,请相应替换为您的实际代码。 谢谢

【讨论】:

【参考方案3】:

您为什么使用动态查询?您可以在运算符 COUNT 中以这种方式使用大小写:COUNT(CASE WHEN <yours filter with time 7.00 > then 1 else null end) AS Available0700 , COUNT(CASE WHEN <yours filter with time 8.00 > then 1 else null end) AS Available0800

【讨论】:

我使用了动态,所以我可以使用变量 day 来指定今天的列。例如。今天它将通过星期四并将其放置在“day”booked 列将是 ThursdayBooked 所以,你可以这样做SET @sqlText = N'SELECT COUNT(CASE WHEN ''07:00'' between ' + @Day + 'StartTime AND ' + @Day + 'EndTime ' then 1 else null end) AS Available0700 , COUNT(CASE WHEN ''08:00'' between ' + @Day + 'StartTime AND ' + @Day + 'EndTime ' then 1 else null end) AS Available0800 FROM tblCarersRota INNER JOIN tblCarersProviders ON tblCarersProviders.CarerID = tblCarersRota.CarerID WHERE Rotation = 2 AND tblCarersProviders.ProviderID = '''+ @Provider + ''' Exec (@sqlText)

以上是关于一次返回多个动态选择查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 postgresql 中使用不同的返回数据执行多个选择查询?

Codeigniter Active Record使用多个主键选择多行

具有多个 where 子句的选择查询在一个结果表中返回多个结果行?

如何使用Power Query动态汇总文件夹下多个Excel文件

选择返回动态列

当查询返回多个 min(count) 数据时,如何从不同表中选择所有行