आप ऐसा कुछ कर सकते हैं। मेरे पास आपका इनपुट डेटा नहीं है, इसलिए मैंने SCOTT.EMP
. का इस्तेमाल किया इसके बजाय।
कुछ बातों पर ध्यान दें। मैंने JOB
. द्वारा समूहीकृत किया , और मैंने GROUPING(JOB)
. का उपयोग किया दोनों SELECT
. में (लेबल जोड़ने के लिए TOTAL
सारांश पंक्ति के लिए) और ORDER BY
. में . चूंकि मैं कॉलम नाम JOB
. का पुन:उपयोग करता हूं में SELECT
(आउटपुट कॉलम के लिए), ORDER BY
. में मुझे कॉलम नाम JOB
. को क्वालिफाई करने में सावधानी बरतनी चाहिए (यह स्पष्ट करने के लिए मैं इनपुट टेबल कॉलम की बात कर रहा हूं, न कि SELECT
. के कॉलम की - जो डिफ़ॉल्ट होगा यदि ORDER BY
. में कॉलम नाम योग्य नहीं थे)। ORDER BY
. में कॉलम नामों को अर्हता प्राप्त करने की आवश्यकता है , फिर, मुझे FROM
. में तालिका को अन्य नाम देने के लिए मजबूर किया क्लॉज (अन्यथा मुझे टेबल का पूरा नाम हर जगह रखना पड़ता)।
GROUPING
का उपयोग करना SELECT
में कार्य करें (NVL
के बजाय ) विशेष रूप से महत्वपूर्ण है यदि JOB
null
हो सकता है . आप नहीं चाहते कि समूह null
. के लिए हो TOTAL
labeled लेबल किया जाने वाला कार्य - आप केवल यही चाहते हैं कि रोलअप पंक्ति के लिए। यह बिंदु बहुत सारे उन्नत प्रोग्रामर को भी भ्रमित करता है।
मैं दिखाता हूं कि आप कैसे "मैन्युअल रूप से" आदेश तय कर सकते हैं:PRESIDENT
पहले, फिर MANAGER
, और फिर अन्य सभी कार्य (वर्णानुक्रम में क्रमित)। यदि आपके पास प्राथमिकता का क्रम कहीं सहेजा गया है, उदाहरण के लिए किसी तालिका में, तो आप उस तालिका में शामिल हो सकते हैं और "मैनुअल" CASE
के बजाय ऑर्डरिंग कॉलम का उपयोग कर सकते हैं मेरी क्वेरी में अभिव्यक्ति।
select case grouping(job) when 0 then job else 'TOTAL' end as job
, sum(sal) as total_salary
from scott.emp e
group by rollup(job)
order by grouping(e.job) -- to get the total in the last row
, case e.job when 'PRESIDENT' then 1 when 'MANAGER' then 2 end
, e.job
;
JOB TOTAL_SALARY
--------- ------------
PRESIDENT 5000
MANAGER 8275
ANALYST 6000
CLERK 4150
SALESMAN 5600
TOTAL 29025