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

डायनामिक कॉलम - SQL सर्वर - कॉलम के रूप में महीने

आपका डेटा पहले से ही पिवट किया गया है, लेकिन इसे एक अलग स्तर पर पिवोट करने की आवश्यकता है। मुझे लगता है कि इसे संभालने का सबसे अच्छा तरीका यह है कि पहले इसे अनपिवट किया जाए, फिर सही पिवट लेवल सेकेंड को हैंडल किया जाए।

चरण 1:अनपिवट करें

आप SQL 2005 UNPIVOT का उपयोग कर सकते हैं कमांड, या क्रॉस जॉइन तकनीक का उपयोग करें। यहां दोनों के उदाहरण दिए गए हैं। नोट मैंने चीजों को सरल रखने के लिए बीच में महीनों को छोड़ दिया। बस उन्हें इसमें जोड़ें।

-- CROSS JOIN method (also works in SQL 2000)
SELECT
   P.Project,
   Mo =
      DateAdd(mm,
         X.MonthNum,
         DateAdd(yy, P.[Year] - 1900, '19000101')
      ),
   Amount = 
      CASE X.MonthNum
         WHEN 0 THEN Jan
         WHEN 1 THEN Feb
         WHEN 11 THEN Dec
      END
FROM
   ProjectData P
   CROSS JOIN (
      SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 11
   ) X (MonthNum)

प्रत्येक पंक्ति को 12 बार दोहराया जाता है, फिर एक CASE कथन प्रत्येक पंक्ति के लिए केवल एक महीने का समय निकालता है, जिससे डेटा अच्छी तरह से अप्रकाशित हो जाता है।

-- UNPIVOT method
SELECT
    P.Project,
    Mo =
       DateAdd(mm,
          Convert(int, P.MonthNum),
          DateAdd(yy, P.[Year] - 1900, '19000101')
       ),
    P.Amount
FROM
   (
      SELECT Project, [Year], [0] = Jan, [1] = Feb, [11] = Dec
      FROM ProjectData
   ) X UNPIVOT (Amount FOR MonthNum IN ([0], [1], [11])) P

DROP TABLE ProjectData

कोई भी तरीका हर समय स्पष्ट प्रदर्शन विजेता नहीं होता है। कभी-कभी एक दूसरे से बेहतर काम करता है (यह इस बात पर निर्भर करता है कि डेटा पिवोट किया जा रहा है)। UNPIVOT विधि निष्पादन योजना में एक फ़िल्टर का उपयोग करती है जो क्रॉस जॉइन नहीं करता है।

चरण 2:फिर से पिवट करें

अब, अप्रकाशित डेटा का उपयोग कैसे करें। आपने यह नहीं बताया कि आपका कोई . कैसा है इसका उपभोग करेंगे, लेकिन चूंकि आपको डेटा को किसी प्रकार की आउटपुट फ़ाइल में डालने की आवश्यकता होगी, मैं एसएसआरएस (एसक्यूएल सर्वर रिपोर्टिंग सर्विसेज) का उपयोग करने का प्रस्ताव करता हूं, जो बिना किसी अतिरिक्त शुल्क के SQL सर्वर 2005 के साथ आता है।

बस मैट्रिक्स का उपयोग करें उपरोक्त प्रश्नों में से किसी एक को पिवट करने के लिए ऑब्जेक्ट की रिपोर्ट करें। यह ऑब्जेक्ट रिपोर्ट रन-टाइम पर कॉलम लेबल बनाने के लिए डेटा मानों को खुशी से निर्धारित करता है और ठीक वैसा ही लगता है जैसा आपको चाहिए। यदि आप एक कॉलम जोड़ते हैं जो आपकी पसंद की तारीख को प्रारूपित करता है, तो आप मो कॉलम द्वारा ऑर्डर कर सकते हैं, लेकिन कॉलम लेबल के रूप में नई अभिव्यक्ति का उपयोग कर सकते हैं।

SSRS में कई प्रकार के प्रारूप और शेड्यूलिंग विकल्प भी उपलब्ध हैं। उदाहरण के लिए, आप इसे एक एक्सेल फ़ाइल ईमेल कर सकते हैं या एक वेब पेज को एक फ़ाइल साझा करने के लिए सहेज सकते हैं।

अगर मैंने कुछ छोड़ा है तो कृपया मुझे बताएं।

जो कोई भी उपरोक्त कोड को क्रिया में देखना चाहता है, उसके लिए यहां कुछ निर्माण स्क्रिप्ट है:

USE tempdb

CREATE TABLE ProjectData (
    Project varchar(10),
    [Year] int,
    Jan decimal(15, 2),
    Feb decimal(15, 2),
    Dec decimal(15, 2)
)

SET NOCOUNT ON

INSERT ProjectData VALUES ('11-11079', 2008, 0.0, 0.0, 75244.90)
INSERT ProjectData VALUES ('11-11079', 2009, 466.0, 0.0, 0.0)
INSERT ProjectData VALUES ('11-11079', 2010, 855.0, 0.0, 0.0)
INSERT ProjectData VALUES ('01-11052', 2009, 56131.0, 0.0, 0.0)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या SQL सर्वर में DECIMAL और NUMERIC के बीच कोई अंतर है?

  2. 2008 के लिए संगत SQL Server 2012 डेटाबेस बनाएँ

  3. केस संवेदनशील से असंवेदनशील मामले में SQL सर्वर संयोजन को बदलना?

  4. SQL सर्वर 2008:मेरे पास 1000 टेबल हैं, मुझे यह जानने की जरूरत है कि किस टेबल में डेटा है

  5. SQL सर्वर के लिए सबसे तेज़ तरीका सम्मिलित करता है, अद्यतन करता है, चयन करता है