2013-03-05 70 views
0

這聽起來有點不好,但我試圖計算查詢中返回行的總數。我試過COUNT()無濟於事。到目前爲止,我有這個疑問:在SQL中計算返回的行的總數

SELECT DISTINCT 
    a.* 
    , LEVEL AS n 
    , count(wipdatavalue) as total 
FROM 
(
    SELECT 
    WIPDATAVALUE 
    , CONTAINERNAME 
    , una 
    , dulo 
    , (dulo - una) + 1 AS m 
    FROM 
    (
    SELECT 
     WIPDATAVALUE 
     , CONTAINERNAME 
     , CASE 
      WHEN INSTR(wipdatavalue, '-') = 0 THEN 
      wipdatavalue 
      ELSE 
      SUBSTR(wipdatavalue, 1, INSTR(wipdatavalue, '-')-1) 
     END AS una 
     , CASE 
      WHEN INSTR(wipdatavalue, '-') = 0 THEN 
      wipdatavalue 
      ELSE 
      SUBSTR(wipdatavalue, INSTR(wipdatavalue, '-') + 1) 
     END AS dulo 
    FROM trprinting 
    WHERE containername = '8PB842613' 
) 
)A CONNECT BY LEVEL <= m 
GROUP BY 
    WIPDATAVALUE 
    , CONTAINERNAME 
    , una 
    , dulo 
    , m 
    , LEVEL 
ORDER BY N; 

enter image description here

我也試圖讓N字段1到8,因爲這應該是正確的輸出。提前致謝。我知道你們會有所幫助:)

+0

無濟於事?這是否意味着你得到不正確的結果?我在你的SQL中看到了一些問題,例如,你應該刪除DISTINCT,因爲GROUP BY已經使它不同。您可以使用ROLLUP標識符在查詢中添加總計行數 - 這是您想要的嗎?以及'將N字段設置爲1到8'是什麼意思? - 是字段顯示的是價值還是錯誤的順序? – 2013-03-05 03:48:20

+0

嗨ElectricLlama。感謝您的建議。是的,你是對的,我可以刪除DISTINCT關鍵詞。我的意思是N字段1到8只是對行進行計數。所以如果它返回8行,第一個值將是1,然後是2到8.類似的東西。還有一件事,TOTAL列應該返回8,因爲有8行返回。 – GianIsTheName 2013-03-05 04:08:53

+0

你的意思是N應該是跑步數量?運行計數排序和重置是什麼?在Oracle中,您通常使用PARTITION BY來計算運行次數。 – 2013-03-05 06:38:20

回答

0

你想要做的事,如:

with data (wipdatavalue, containername, una, dulo, m, n) 
    as (select wipdatavalue,containername,una,dulo,(dulo - una) + 1 as m,una n 
      from (select wipdatavalue,containername, 
         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 
        where containername = '8PB842613') 
     union all 
     select wipdatavalue,containername,una,dulo,m,n + 1 
      from data 
      where n + 1 <= dulo) 
select wipdatavalue,containername,una,dulo,m,n, 
     count(*) over() total_rows 
    from data 
order by wipdatavalue,n; 

小提琴:http://sqlfiddle.com/#!4/11082/2

+0

嗨Dazzal,你的代碼片段很棒!謝謝,我欠你一杯啤酒:) – GianIsTheName 2013-03-05 08:59:22