【问题标题】:List same row twice if the count is more than 1 in another column如果另一列中的计数大于 1,则列出同一行两次
【发布时间】:2017-10-05 07:19:59
【问题描述】:

我遇到了这个要求,如果相应的列值大于 1,则在输出中列出该行两次。

Calls       Abandoned
Microsoft   1
Apple       1
IBM         2
CISCO       3

Output Needed:
Calls       Abandoned
Microsoft   1
Apple       1
IBM         1
IBM         1
CISCO       1
CISCO       1
CISCO       1

我尝试在sql中使用排名功能,似乎不起作用。有什么解决办法吗?

【问题讨论】:

标签: sql sql-server tsql ssms ranking


【解决方案1】:

一种方法使用数字表或 CTE。或者,如果给定的 call 只有几行,那么递归 CTE 就足够简单了:

with cte as (
      select call, abandoned
      from t
      union all
      select call, abandoned - 1
      from cte
      where abandoned > 1
    )
select call, 1 as abandoned
from cte;

每个call 最多可以处理 100 行。之后,您需要将MAXRECURSION 设置为更高的值。

编辑:

这是rextester

【讨论】:

  • 谢谢戈登。这很好用,但没有给我完整的记录。我应该得到总共 102 条记录,但这种技术只给了我 97 条记录。你知道为什么吗?
  • @axlrose89 。 . .这应该为每次调用返回一行。是被抛弃的整数吗?它有不寻常的价值吗?
【解决方案2】:

另一种方法是使用 master..spt_values

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/b5f13a70-6ff5-4704-83d6-e1cd68f172b5/select-the-numbers-between-two-numbers?forum=transactsql

declare @mytable table (calls varchar(20), abandoned smallint)

insert into @mytable
values ('Microsoft',   1),
('Apple',       1),
('IBM',         2),
('CISCO',       3)

select calls,1 [Abandoned]  from @mytable t
   cross apply
   ( SELECT DISTINCT number
    FROM master..spt_values
    WHERE number BETWEEN 1 AND t.abandoned
   ) x


-- or simplest

SELECT  t1.calls, 1 [abandoned]
FROM    @mytable t1
JOIN    master.dbo.spt_values t2 on type = 'P' and number < t1.abandoned

>但是master.dbo.spt_values的数字最多只能到2048

CTE 将是最好的答案。

【讨论】:

  • 谢谢。 master.dbo.spt_values 对我来说效果很好,但我的数据集很大。尝试使用下面提到的 Gordon 的 cte,但没有给我完整的记录。
猜你喜欢
  • 2021-04-21
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
相关资源
最近更新 更多