这与减少重复记录相反。 用于创建物理清单核对清单的SQL查询 如果widget-xyz有1个项目的数量返回1行,但是如果它有5个,返回5个行等。 对于特定仓库中的所有小部件。SQL从一条记录返回多行
此前,这是通过在excel中检查数量列的宏来处理的。有没有办法让一个单一的查询呢?
表是由应用程序生成的FoxPro DBF文件,我输出到HTML
这与减少重复记录相反。 用于创建物理清单核对清单的SQL查询 如果widget-xyz有1个项目的数量返回1行,但是如果它有5个,返回5个行等。 对于特定仓库中的所有小部件。SQL从一条记录返回多行
此前,这是通过在excel中检查数量列的宏来处理的。有没有办法让一个单一的查询呢?
表是由应用程序生成的FoxPro DBF文件,我输出到HTML
对于SQL 2005/2008,看看
CROSS APPLY
我会做的是CROSS APPLY每一行与子表为多的行数量了。次要问题是如何创建一个子表(我建议创建一个XML字符串,然后与运营商的XML解析它) 我希望这给你一个起始点指针....
与
开始declare @table table (sku int, qty int);
insert into @table values (1, 5), (2,4), (3,2);
select * from @table;
sku qty
----------- -----------
1 5
2 4
3 2
您可以生成:
with MainT as (
select *, convert(xml,'<table>'+REPLICATE('<r></r>',qty)+'</table>') as pseudo_table
from @table
)
select p.sku, p.qty
from MainT p
CROSS APPLY
(
select p.sku from p.pseudo_table.nodes('/table/r') T(row)
) crossT
sku qty
----------- -----------
1 5
1 5
1 5
1 5
1 5
2 4
2 4
2 4
2 4
3 2
3 2
这是你想要的吗? 认真花花公子......下一次花更多精力写下你的问题。不可能确切地知道你在找什么。
代替生成一个XML字符串,并使用XML解析函数生成一个计数器作为内斯特曾建议的,你可以考虑作为一个计数器加入一个递归CTE,作为LukLed已经暗示到:
WITH Counter AS
(
SELECT 0 i
UNION ALL
SELECT i + 1
FROM Counter
WHERE i < 100
),
Data AS
(
SELECT 'A' sku, 1 qty
UNION
SELECT 'B', 2
UNION
SELECT 'C', 3
)
SELECT *
FROM Data
INNER JOIN Counter ON i < qty
根据查询分析器,这个查询比xml伪表要快得多。这种方法还为您提供了一个带有自然键(sku,i)的记录集。
在MSSQL中有一个默认的递归限制100,它会限制你的计数器。如果您的数量> 100,则可以增加此限制,使用嵌套计数器或创建一个物理表格进行计数。
谢谢这非常值得一看 – datatoo 2010-02-11 20:59:02
此问题的答案高度依赖于您正在使用的数据库平台。 SQL Server?甲骨文?访问? – 2009-11-07 21:46:55