2010-06-28 86 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

相關問題