带有列号的SQL循环

时间:2016-03-11 14:22:47

标签: sql sql-server sql-server-2014

我有一张3柱和4排的桌子。

Actions actions = new Actions(driver);
WebElement menu = driver.findElement(By.xpath("//*[@id='menu-links']/a/div[3]"));
actions.moveToElement(menu);

WebElement subMenu = driver.findElement(By.xpath("//*[@id='menu-links']/ul/li[2]/a"));
actions.moveToElement(subMenu);
actions.click().build().perform();

Col1 Col2 Col3 Row1 A1 B1 1 Row2 A2 B2 0 Row3 A3 B3 3 Row4 A4 B4 1 返回:

select * from [table]

我想要一个选择:

A1 B1 1
A2 B2 0
A3 B3 3
A4 B4 1

Col3给出行返回的数量。

1 个答案:

答案 0 :(得分:5)

从数字表开始......每个数字都有一行的表格,最高可达Col3中可能的最大值。它看起来像这样:

表:数字

Value
-----
  1
  2
  3
  4
  5
  ...

然后你可以使用不等式JOIN到这个表:

SELECT Col1, Col2, Col3
FROM [table] t
INNER JOIN NUMBERS n ON n.Value <= t.Col3

这将使您的Row3值与Numbers表匹配3次,在结果中复制该行,而Row2值不匹配Numbers表中的任何记录,将其从结果中删除

您可以在此处查看几个用于生成Numbers表格的选项:

  

What is the best way to create and populate a numbers table?

使用该问题的选项6:

WITH Numbers AS (
     SELECT TOP 10000 row_number() over(order by t1.number) as [Value]
     FROM master..spt_values t1 
     CROSS JOIN master..spt_values t2
)
SELECT Col1, Col2, Col3
FROM [table] t
INNER JOIN NUMBERS n ON n.Value <= t.Col3

请注意,这对于您的示例数据来说太过分了,只有3。对于任何小于50的东西,你可以只对表格进行硬编码。我假设你的真实数据要高得多。