Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

एकाधिक कॉलम में शामिल होने और परिणाम देने के लिए SQL कथन

आपने RDBMS निर्दिष्ट नहीं किया, लेकिन यह मूल रूप से एक pivot है यदि आपके डेटाबेस के पास उस फ़ंक्शन तक पहुंच है। यदि नहीं, तो आप case . का उपयोग करके दोहरा सकते हैं और एक समग्र कार्य।

<स्ट्राइक>MySQL :

select name,
  sum(case when group_rn = 1 then amount else 0 end) Amount1,
  sum(case when group_rn = 2 then amount else 0 end) Amount2,
  sum(case when group_rn = 3 then amount else 0 end) Amount3
from
(
  select name,
    @num := if(@name = `name`, @num + 1, 1) as group_rn,
    @name := `name` as dummy,
    amount
  from
  (
    select p.name,
      d.amount,
      d.decl_id
    from person p
    inner join declaration d
      on p.person_id = d.person_id
  ) src
  order by name
) p
group by name

देखें SQL Fiddle with Demo

SQL सर्वर और Oracle में PIVOT फ़ंक्शन मौजूद है:

एसक्यूएल सर्वर :

select name,
  [1] as Amount1,
  [2] as Amount2,
  [3] as Amount3
from
(
  select p.name,
    d.amount,
    row_number() over(partition by p.name order by d.amount) rn
  from person p
  inner join declaration d
    on p.person_id = d.person_id
) src
pivot
(
  sum(amount)
  for rn in ([1], [2], [3])
) p

देखें SQL Fiddle with Demo

आप गतिशील संस्करण बना सकते हैं, यदि आपके पास अज्ञात संख्या में राशियाँ हैं जिन्हें आप कॉलम में बदलना चाहते हैं।

संपादित करें, आपने कहा है कि आप Oracle का उपयोग कर रहे हैं, इसलिए oracle विशिष्ट उत्तर नीचे हैं:

ओरेकल 11g में pivot है समारोह:

select name,
  Amount1,
  Amount2,
  Amount3
from
(
  select p.name,
    d.amount,
    row_number() over(partition by p.name order by d.amount) rn
  from person p
  inner join declaration d
    on p.person_id = d.person_id
) src
pivot
(
  sum(amount)
  for rn in ('1' as Amount1, '2' as Amount2, '3' as Amount3)
) p

देखें SQL Fiddle with Demo

यदि आप Oracle 11g पर नहीं हैं, तो आपको CASE . का उपयोग करने की आवश्यकता होगी समग्र कार्य के साथ:

select name,
  sum(case when rn = 1 then amount else 0 end) Amount1,
  sum(case when rn = 2 then amount else 0 end) Amount2,
  sum(case when rn = 3 then amount else 0 end) Amount3
from
(
  select p.name,
    d.amount,
    row_number() over(partition by p.name order by d.amount) rn
  from person p
  inner join declaration d
    on p.person_id = d.person_id
) src
group by name

देखें SQL Fiddle with Demo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle में XPath द्वारा पहला तत्व कैसे प्राप्त करें?

  2. ओरेकल मेरी टेबल को कैसे पिवट करें

  3. अद्यतन क्वेरी - Oracle

  4. नेस्टेड कुल कार्य

  5. कोई रिकॉर्ड न होने पर SUM का चयन करें एक पंक्ति लौटाता है