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

sql तालिका को मैट्रिक्स रूप में बदलें

यह आपके लिए मददगार हो सकता है। मैंने उपयोग किया है CASE WHEN THEN END PIVOT . प्राप्त करने के लिए ब्लॉक करें ।

SELECT USERS.USER_NAME
  , MAX(COALESCE(TEST.USER1, 0)) USER1
  , MAX(COALESCE(TEST.USER2, 0)) USER2
  , MAX(COALESCE(TEST.USER3, 0)) USER3
  , MAX(COALESCE(TEST.USER7, 0)) USER7
FROM (
  SELECT DISTINCT USER_NAME 
  FROM (
      SELECT USER_NAME FROM TEST
      UNION ALL
      SELECT M_USER FROM TEST
    )
  ) USERS
    LEFT OUTER JOIN (
      SELECT
          USER_NAME
          , M_USER
          , CASE WHEN M_USER = 'user 1' THEN TOTAL ELSE 0 END AS USER1
          , CASE WHEN M_USER = 'user 2' THEN TOTAL ELSE 0 END AS USER2
          , CASE WHEN M_USER = 'user 3' THEN TOTAL ELSE 0 END AS USER3
          , CASE WHEN M_USER = 'user 7' THEN TOTAL ELSE 0 END AS USER7
      FROM TEST
    ) TEST ON USERS.USER_NAME = TEST.USER_NAME
GROUP BY USERS.USER_NAME
ORDER BY USERS.USER_NAME

अपडेट करें

मुझे इसे एक ही प्रश्न में लिखने का कोई तरीका नहीं मिला। कुछ विश्लेषण के बाद मैंने पाया यह

CREATE OR REPLACE FUNCTION GETUSERS RETURN SYS_REFCURSOR AS
  QUERY VARCHAR2(32767);
  RC SYS_REFCURSOR;
BEGIN

  QUERY := 'SELECT USERS.USER_NAME ';

  FOR TMP IN (SELECT DISTINCT UPPER(REPLACE(USER_NAME, ' ', '')) USER_NAME FROM (SELECT USER_NAME FROM TEST UNION ALL SELECT M_USER FROM TEST) ORDER BY USER_NAME)
  LOOP
    QUERY := QUERY || '  , MAX(COALESCE(TEST.' || TMP.USER_NAME || ' , 0)) ' || TMP.USER_NAME;
  END LOOP;

  QUERY := QUERY || ' FROM ( ';
  QUERY := QUERY || '  SELECT DISTINCT USER_NAME ';
  QUERY := QUERY || '  FROM ( ';
  QUERY := QUERY || '      SELECT USER_NAME FROM TEST ';
  QUERY := QUERY || '      UNION ALL ';
  QUERY := QUERY || '      SELECT M_USER FROM TEST ';
  QUERY := QUERY || '    ) ';
  QUERY := QUERY || '  ) USERS ';
  QUERY := QUERY || '    LEFT OUTER JOIN ( ';

  QUERY := QUERY || ' SELECT USER_NAME';
  FOR TMP IN (SELECT DISTINCT USER_NAME, REPLACE(USER_NAME, ' ', '') USER_COL_NM FROM (SELECT USER_NAME FROM TEST UNION ALL SELECT M_USER FROM TEST))
  LOOP
    QUERY := QUERY || ', CASE WHEN M_USER = ''' || TMP.USER_NAME
      || ''' THEN TOTAL ELSE 0 END AS ' || TMP.USER_COL_NM ;
  END LOOP;
  QUERY := QUERY || ' FROM TEST';

  QUERY := QUERY || '    ) TEST ON USERS.USER_NAME = TEST.USER_NAME ';
  QUERY := QUERY || 'GROUP BY USERS.USER_NAME ';
  QUERY := QUERY || 'ORDER BY USERS.USER_NAME';

  OPEN RC FOR QUERY;

  RETURN RC;
END;
/

बनाया गया फ़ंक्शन जो गतिशील रूप से SQL बनाता है और देता है SYS_REFCURSOR . इसे SQL*Plus या SQL Developer ('एक स्क्रिप्ट के रूप में चलाएं' के साथ) में चलाया जा सकता है,

VAR RC REFCURSOR;
EXEC :RC := GETUSERS;
PRINT RC



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ओरेकल पर एक उपयोगकर्ता द्वारा एक साथ कनेक्शन को अक्षम कैसे करें

  2. मैं अपने मामले में Oracle में SQL कैसे लिख सकता हूँ?

  3. Oracle के साथ चुनिंदा परिणामों को स्थानांतरित करें

  4. Oracle 10g में एक टेबल कॉलम का नाम कैसे बदलें

  5. javax.persistence.EntityExistsException सीक्वेंस जेनरेटर के साथ