sql查询动态返回行数

标签 sql sql-server

我有一个表格

 CREATE TABLE [dbo].[table1](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[clientid] [int] NULL,
[startdate] [int] NULL,
[copyid] [int] NULL

)

表中数据的形式为:

 id clientid startdate  copyid
 1       4        11    1
 2       4        12    1
 3       4        44    2
 3       5       123    1
 4       5        15    1
 5       5        12    2
 6       5        12    2
 7       5        12    2

copyid 是 clientid 的子集

我的问题是我可以形成一个选择查询来返回一个包含 N 行的表 并且是 clientid 和 copyid 组合的副本,并且 copyid 递增。

例如如果 clientid 为 4,copyid 为 1,N 为 6,则应该返回 6 行,如

  clientid startdate   copyid
  4        11           3
  4        12           3
  4        11           4
  4        12           4
  4        11           5
  4        12           5

N 始终是客户端和副本组合的倍数

我知道如何使用循环来做到这一点。但是可以使用单个选择查询吗?

最佳答案

这可以使用简单的光标来完成。

使用您在问题中提供的示例数据,我创建了以下解决方案:

DECLARE @ClientID INT = 4 
DECLARE @CopyID INT = 1 
DECLARE @N INT = 6

;WITH DATA 
     AS (SELECT *, 
                Row_number () 
                  OVER ( 
                    ORDER BY ID)           RN, 
                Count(*) 
                  OVER ( 
                    PARTITION BY CLIENTID) CID 
         FROM   (SELECT *, 
                        Max(COPYID) 
                          OVER ( 
                            PARTITION BY CLIENTID) MaxID, 
                        0                          AS root 
                 FROM   TABLE1)T 
         WHERE  CLIENTID = @clientid 
                AND COPYID = @Copyid), 
     CTE 
     AS (SELECT * 
         FROM   DATA 
         UNION ALL 
         SELECT t2.[ID], 
                t2.[CLIENTID], 
                t2.[STARTDATE], 
                t2.[COPYID], 
                t2.MAXID, 
                t2.ROOT + 1, 
                t2.RN + T2.CID RN, 
                T2.CID 
         FROM   DATA t1 
                INNER JOIN CTE t2 
                        ON t1.ID = t2.ID 
         WHERE  t2.RN < @N - 1) 
SELECT CLIENTID, 
       STARTDATE, 
       MAXID + ROOT + 1 COPYID 
FROM   CTE 
WHERE  RN <= @N 
ORDER  BY COPYID 

可以在 SQL Fiddle 上找到一个工作示例。 。

关于sql查询动态返回行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18451728/

相关文章:

sql-server - 如何从更多列中选择但按 1 列分组?

sql - 每月获取一行数据,即使该月没有数据

sql-server - 哪些因素会导致 SQL Server 上的存储过程重新编译?

java - 映射返回空值

sql - 如何使用 SQL 识别或识别数据中的模式

sql - 可以使用 DISTINCT 进行分区函数 COUNT() OVER

MySQL - 如何列出每个日历年工作不超过一次的所有志愿者

sql - 从参数动态 SQL 查询

sql - 如何检查数据库中是否存在临时表

sql - 我可以用一种方法编辑多个SQL表吗?