2013-03-14 80 views
-1

我將創建一個查詢,該查詢將用於在我們的項目中打印標籤,並且因爲標籤數量的計數基於字符串而很難找到。我做了一個查詢,看起來像這樣:在oracle查詢中複製行

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 

上面的查詢將導致以下:

enter image description here

但實際上,我要顯示的第一項(Wipdatavalue 1-4)不僅一次,而是四次是這個樣子:

enter image description here

我試圖運行另一個查詢很好,但是當我嘗試將其加載到我們的項目中時,它不打印標籤。我們發現這是因爲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 

謝謝你們幫忙。

+0

請分享表結構和一些示例數據如果可能... – 2013-03-14 08:39:37

+0

你好Vineet,我沒有訪問表結構。至於示例數據,我已經在上面的圖片上了。如果您需要其他東西,請告訴我。 – GianIsTheName 2013-03-14 08:44:45

+0

爲什麼在第一個查詢中需要'group by'? recurcieve CTE(第二個查詢)只在oracle 11gR2中是你正在使用的 – 2013-03-14 08:46:22

回答

0

試試這個

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替代(也可能更快)

Here is a sqlfiddle demo

+0

你好A.B.凱德,這一個工作正常,除了安排:)我不知道我們如何解決這個問題。 – GianIsTheName 2013-03-14 09:50:01

+0

@GianIsTheName,當你說安排,你的意思是順序?如果是這樣,嘗試添加'order by regexp_substr(Wipdatavalue,'^ \ d +')' – 2013-03-14 10:01:29

0

嘗試此查詢

select column_name, count(column_name) 
from table 
group by column_name 
having count (column_name) > 1;