Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
遍历SQL表创建另一个SQL表_Sql_Sql Server_Tsql_Stored Procedures_Common Table Expression - Fatal编程技术网

遍历SQL表创建另一个SQL表

遍历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行的桌子 对于如何实现这一目标,我有点不知所措……有人能帮忙

不知道是否有人可以关注以下问题:

我正在运行一个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行的桌子

对于如何实现这一目标,我有点不知所措……有人能帮忙吗

//////////////////////////////////////////////////////////// 使用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表。不过,我知道您的链接很有用,我会将其添加到答案中作为进一步的参考。谢谢各位,我将在此举行一次聚会,并向大家汇报: