2010-06-28 38 views
2

我需要显示表中每个字段的多个结果。我只需要用一个SQL语句来做到这一点,我不想使用Cursor。从一个字段显示多行,结果相同

这看起来很愚蠢,但每行的行数可能会有所不同。我需要这个以后将这些信息打印成Crystal Report的细节。

假设我有这个表:

idItem  Cantidad  <more fields> 
-------- ----------- 
    1000   3 
    2000   2 
    3000   5 
    4000   1 

我需要这样的结果,使用一个唯一的SQL语句:

1000 
1000 
1000 
2000 
2000 
3000 
3000 
3000 
3000 
3000 
4000 

其中每个idItemCantidad行。

任何想法?

回答

0

这似乎是一件应该在UI(或报告)进行处理。我不太了解水晶报表,在那里提出建议。如果你真的,真的需要做的是在SQL,那么你可以使用一个号码表(或类似的东西):

SELECT 
    idItem 
FROM 
    Some_Table ST 
INNER JOIN Numbers N ON 
    N.number > 0 AND 
    N.number <= ST.cantidad 

你可以用一个子查询或函数或任何其他方法,你要替换的数字表生成一个至少足够大的数字结果集,以覆盖您最大的cantidad。

0

如果您使用的是“数字”表是本产品和许多类似用途有用的,你可以使用下面的SQL:

select t.idItem 
    from myTable t 
     join numbers n on n.num between 1 and t.Cantidad 
order by t.idTtem 

的数字表应该只​​包含从0或1的所有整数数量足够大,Cantidad永远不会超过它。

+0

如果您发布的是代码或XML,请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮(101 010),以良好地格式化和语法突出显示它! – 2010-06-28 17:09:08

0

正如其他人所说,你需要一个Numbers或Tally表,它只是一个整数的顺序列表。但是,如果你知道Cantidad是永远不会比例如五个较大的,你可以这样做:

Select idItem 
From Table 
    Join (
      Select 1 As Value 
      Union All Select 2 
      Union All Select 3 
      Union All Select 4 
      Union All Select 5 
      ) As Numbers 
     On Numbers.Value <= Table.Cantidad 

如果您使用的是SQL Server 2005中,你可以使用一个CTE做:

With Numbers As 
    (
    Select 1 As Value 
    Union All 
    Select N.Value + 1 
    From Numbers As N 
    ) 
Select idItem 
From Table 
    Join Numbers As N 
     On N.Value <= Table.Cantidad 
Option (MaxRecursion 0); 
+0

是的,我想到递归,但它是SQL 2000.我的错误不是澄清这一点。 – Claudia 2010-06-28 18:03:05

+0

@Claudi - 好的。然后,无论您需要多少个整数,一次构建一个永久的Numbers表,或者如果您需要的值很小,则可以使用我的第一个解决方案。 – Thomas 2010-06-28 18:42:31

相关问题