遍历SQL表创建另一个SQL表
不知道是否有人可以关注以下问题: 我正在运行一个SQL SELECT语句,该语句给出以下结果:遍历SQL表创建另一个SQL表,sql,sql-server,tsql,stored-procedures,common-table-expression,Sql,Sql Server,Tsql,Stored Procedures,Common Table Expression,不知道是否有人可以关注以下问题: 我正在运行一个SQL SELECT语句,该语句给出以下结果: DATE NumberOfHours 2017-05-01 4 2017-06-01 38 2017-07-01 68 我想做的是在这个表的后面创建另一个表,其中包含2017-05-01的4行、2017-06-01的38行和2017-07-01的68行。所以我最终得到了一张有110行的桌子 对于如何实现这一目标,我有点不知所措……有人能帮忙
DATE NumberOfHours
2017-05-01 4
2017-06-01 38
2017-07-01 68
我想做的是在这个表的后面创建另一个表,其中包含2017-05-01的4行、2017-06-01的38行和2017-07-01的68行。所以我最终得到了一张有110行的桌子
对于如何实现这一目标,我有点不知所措……有人能帮忙吗
////////////////////////////////////////////////////////////
使用Gordon Linoff列出的响应,我成功地通过以下方式实现了这一点:
with cte as (
SELECT DATEADD(month, datediff(month,0,L.DateAdded),0) AS 'Date', CEILING(SUM(l.CPDHours))AS NumberOfHours
FROM WebsiteICA_SF.dbo.CPD_Log L
WHERE L.DateAdded >= DATEADD(month, -6, GETDATE())
AND (L.Provider = 'ICA' OR L.Provider like 'International Compli%')
GROUP BY DATEADD(month, datediff(month,0,L.DateAdded),0)
union all
select date, NumberOfHours - 1
from cte
where NumberOfHours > 1
)
select 1 AS 'ObId', date, 'ICA' AS Provider, '# ICA' AS DataType
from cte
order by DATEADD(month, datediff(month,0,cte.Date),0)
OPTION (maxrecursion 10000);
因此,您有一个包含3行和一列的结果集,它告诉您它代表了多少行。您希望生成那么多行 不确定要在其中存储什么,但下面是基本问题的解决方案: 创建一个表temp table或CTE也很好,它只包含一列,存储从0到任何数字。这称为理货表或数字表 将此表加入您的结果集:
WITH NumbersCTE AS (
-- This will give you a bunch of Numbers
-- Persist a table if you want to use it more frequently
SELECT ROW_NUMBER() OVER (ORDER BY name) AS Number FROM sys.columns
)
SELECT
MT.Date,
N.Number
FROM
dbo.MyTable MT
INNER JOIN NumbersCTE N
ON N.Number <= MT.NumberOfHours
正如Pieter Geerkens在评论中指出的那样,上述方法不是生成数字表的最佳方法,但对于演示学生来说,这是很好的
有关如何在SQL Server中生成理货表的详细信息,请查看
一种简单的方法是递归CTE:
with cte as (
select date, NumberOfHours
from t
union all
select date, NumberOfHours - 1
from cte
where NumberOfHours > 1
)
select date
from cte;
默认情况下,这最多限制为100小时。但是,使用MAXRECURSION选项可以很容易地改变这一点
其他方法通常依赖第二个表来生成数字。我也喜欢这种方法,因为它温和地介绍了递归CTE
是一个很好的SQL工具。请发布您的表定义和数据这是正在动态构建的临时表。日期字段是日期时间,NumberOfRows是整数。谢谢,您打算对创建的行做什么。也许一点背景能帮助人们理解?还有,哪个数据库?听起来像是一个家庭作业,哈哈。你考虑过了吗?有没有代码启动了,我们可以看看?提示:createtable可以创建您的表。在T-SQL WHILE上进行internet搜索,并查看示例部分以了解如何使用WHILE。看起来像是3个WHILE语句,递增您声明的变量以记录插入的行数。这有助于思考结果表中的内容以及数据来自何处。这将减少创建一堆空的无意义行的工作量。例如,如果日期与一组行数相对应,那么您已经有了表。由于sys.columns中的行数相当有限,按照现代标准,您可能希望将OP指向一个Ben-Gan样式的理货表,例如。@PieterGeerkens为了演示如何使用它,它已经足够了。就我个人而言,我讨厌动态完成,我的数据库中总是有一个持久化的util.Numbers表。不过,我知道您的链接很有用,我会将其添加到答案中作为进一步的参考。谢谢各位,我将在此举行一次聚会,并向大家汇报: