一次返回多个动态选择查询
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 子句的选择查询在一个结果表中返回多个结果行?