在oracle查询中复制行
我将创建一个查询,该查询将用于在我们的项目中打印标签,并且发现它很难,因为标签数量的计数是基于字符串的。我提出了如下查询:在oracle查询中复制行,oracle,Oracle,我将创建一个查询,该查询将用于在我们的项目中打印标签,并且发现它很难,因为标签数量的计数是基于字符串的。我提出了如下查询: SELECT wipdatavalue , containername , l , q as qtybox , d , qtyperbox AS q , productname , dt , dsn , CASE WHEN instr(wipdatavalue, '-') = 0 THEN
SELECT
wipdatavalue
, containername
, l
, q as qtybox
, d
, qtyperbox AS q
, productname
, dt
, dsn
, CASE
WHEN instr(wipdatavalue, '-') = 0
THEN
to_number(wipdatavalue)
ELSE
to_number(substr(wipdatavalue, 1, instr(wipdatavalue, '-') - 1))
END AS una
, CASE
WHEN instr(wipdatavalue, '-') = 0
THEN
to_number(wipdatavalue)
ELSE
to_number(substr(wipdatavalue, instr(wipdatavalue, '-') + 1))
END AS dulo
, ROW_NUMBER() OVER (ORDER BY containername) AS n
, count(*) over() m
FROM trprinting_ls
WHERE containername = 'TRALTESTU0A'
GROUP BY wipdatavalue, containername, l, q, d, qtyperbox, productname, dt, dsn
ORDER BY wipdatavalue
上述查询将导致以下结果:
但实际上,我必须显示第一个项目Wipdatavalue 1-4,不仅显示一次,而且显示四次,以显示如下内容:
SELECT
wipdatavalue
, containername
, l
, q as qtybox
, d
, qtyperbox AS q
, productname
, dt
, dsn
, CASE
WHEN instr(wipdatavalue, '-') = 0
THEN
to_number(wipdatavalue)
ELSE
to_number(substr(wipdatavalue, 1, instr(wipdatavalue, '-') - 1))
END AS una
, CASE
WHEN instr(wipdatavalue, '-') = 0
THEN
to_number(wipdatavalue)
ELSE
to_number(substr(wipdatavalue, instr(wipdatavalue, '-') + 1))
END AS dulo
, ROW_NUMBER() OVER (ORDER BY containername) AS n
, count(*) over() m
FROM trprinting_ls
WHERE containername = 'TRALTESTU0A'
GROUP BY wipdatavalue, containername, l, q, d, qtyperbox, productname, dt, dsn
ORDER BY wipdatavalue
我尝试了另一个运行良好的查询,但当我尝试在项目中加载它时,它不会打印标签。我们发现这是因为WITH声明,我们不知道为什么。查询是:
WITH DATA (WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYBOX, PRODUCTNAME, DT, una, dulo, m1, n)
AS (SELECT WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYBOX, PRODUCTNAME, DT, una, dulo,(dulo - una) + 1 AS m1,una n
FROM (SELECT WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYPERBOX AS QTYBOX, PRODUCTNAME, DT,
CASE
WHEN instr(wipdatavalue, '-') = 0
THEN
to_number(wipdatavalue)
ELSE
to_number(substr(wipdatavalue, 1, instr(wipdatavalue, '-') - 1))
END AS una,
CASE
WHEN instr(wipdatavalue, '-') = 0
THEN
to_number(wipdatavalue)
ELSE
to_number(substr(wipdatavalue, instr(wipdatavalue, '-') + 1))
END AS dulo
FROM trprinting_ls
WHERE containername = 'TRALTESTU0A'
)
UNION ALL
SELECT WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYBOX, PRODUCTNAME, DT, una, dulo, m1, n + 1
FROM DATA
WHERE n + 1 <= dulo)
SELECT WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYBOX, PRODUCTNAME, DT, una, dulo, n,
count(*) OVER () m
FROM DATA
ORDER BY n, wipdatavalue
谢谢大家的帮助。试试这个查询
试试这个
select *
from your_data
start with instr(Wipdatavalue, '1') > 0
connect by level between regexp_substr(Wipdatavalue, '^\d+')
and regexp_substr(Wipdatavalue, '\d+$')
这是一个简化的例子
regexp_substr可以替换为substr,如果您愿意,instr也可以更快
如果可能,请共享表结构和一些示例数据……您好,Vinet,我没有访问表结构的权限。至于样本数据,我在上面的图片上有。如果您还需要其他东西,请告诉我。为什么在第一个查询中需要group by?recurcieve CTEs第二个查询仅在oracle 11gR2中使用。Hi A.B.Cade,我使用group by表达式,因为我计算所有返回行的总数,即m。我不确定我们是否使用11gR2。如果不使用WITH语句,还有其他方法可以做到这一点吗?因为您使用的是count*over,您不需要group by,over使其成为一个窗口函数,请尝试删除group by,看看它是否适用于您您好a.B.凯德,这个方法很好,除了以下安排:我想知道如何解决此问题。@GianIsTheName,你说的“安排”是指订单吗?如果是,请尝试按regexp_substrWipdatavalue“^\d+”添加订单