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

ऊर्ध्वाधर परिणाम को क्षैतिज मोड में बदलना (T-SQL)

जैसा कि कहा गया है कि यह वास्तव में संभव नहीं है, आप जो निकटतम प्राप्त कर सकते हैं वह है:

January2014CalculationDate | January2014PLResult | February2014CalculationDate | February2014PLResult
---------------------------+---------------------+-----------------------------+------------------
    2014-01-02             |       100           |       2014-02-03            |       300
    2014-01-03             |       200           |       2014-02-04            |       400
    NULL                   |       NULL          |       2014-02-27            |       500

और यह भी आसान नहीं है और मैं अभी भी एसक्यूएल के बाहर इस तरह स्वरूपण को संभालने की सलाह दूंगा। पहला कदम डेटा को महीने के आधार पर विभाजित करना है, और फिर प्रत्येक महीने में तारीखों को रैंक करना है:

SELECT  CalculationDate,
        PLResult,
        CalculationMonth,
        DenseRank = DENSE_RANK() OVER(PARTITION BY CalculationMonth ORDER BY CalculationDate)
FROM    (   SELECT  CalculationDate,
                    PLResult,
                    CalculationMonth = DATEADD(MONTH, DATEDIFF(MONTH, 0, CalculationDate), 0)
            FROM    #PLResultPerDay
        ) pl;

यह देता है:

CalculationDate PLResult    CalculationMonth    DenseRank
2014-01-02      100         2014-01-01          1
2014-01-03      200         2014-01-01          2
2014-02-03      300         2014-02-01          1
2014-02-04      400         2014-02-01          2
2014-02-27      500         2014-02-01          3

फिर आप इस डेटा को पिवट कर सकते हैं:

WITH Data AS
(   SELECT  CalculationDate,
            PLResult,
            CalculationMonth,
            DenseRank = DENSE_RANK() OVER(PARTITION BY CalculationMonth ORDER BY CalculationDate)
    FROM    (   SELECT  CalculationDate,
                        PLResult,
                        CalculationMonth = DATEADD(MONTH, DATEDIFF(MONTH, 0, CalculationDate), 0)
                FROM    #PLResultPerDay
            ) pl
)
SELECT  Jan2014CalcDate = MIN(CASE WHEN CalculationMonth = '20140101' THEN CalculationDate END),
        Jan2014Result = SUM(CASE WHEN CalculationMonth = '20140101' THEN PLResult END),
        Feb2014CalcDate = MIN(CASE WHEN CalculationMonth = '20140201' THEN CalculationDate END),
        Feb2014Result = SUM(CASE WHEN CalculationMonth = '20140201' THEN PLResult END)
FROM    Data
GROUP BY DenseRank
ORDER BY DenseRank;

यह देता है:

Jan2014CalcDate Jan2014Result   Feb2014CalcDate Feb2014Result
2014-01-02      100             2014-02-03      300
2014-01-03      200             2014-02-04      400
NULL            NULL            2014-02-27      500

फिर चूंकि आपके पास महीनों की एक गतिशील संख्या है, इसलिए आपको उपरोक्त कथन को गतिशील रूप से बनाने और SP_EXECUTESQL का उपयोग करने की आवश्यकता है इसे चलाने के लिए:

DECLARE @SQL NVARCHAR(MAX) = '';

WITH Months AS
(   SELECT  M,
            ColName = DATENAME(MONTH, M) + DATENAME(YEAR, M),
            CharFormat = CONVERT(VARCHAR(8), M, 112)
    FROM    (   SELECT  DISTINCT M = DATEADD(MONTH, DATEDIFF(MONTH, 0, CalculationDate), 0)
                FROM    #PLResultPerDay
            ) m
)
SELECT  @SQL = 'WITH Data AS
                (   SELECT  CalculationDate,
                            PLResult,
                            CalculationMonth,
                            DenseRank = DENSE_RANK() OVER(PARTITION BY CalculationMonth ORDER BY CalculationDate)
                    FROM    (   SELECT  CalculationDate,
                                        PLResult,
                                        CalculationMonth = DATEADD(MONTH, DATEDIFF(MONTH, 0, CalculationDate), 0)
                                FROM    #PLResultPerDay
                            ) pl
                )
                SELECT  ' + 
                STUFF(( SELECT  ', ' + ColName + 'CalculationDate = MIN(CASE WHEN CalculationMonth = ''' + CharFormat + ''' THEN CalculationDate END), ' + 
                                ColName + 'PLResult = SUM(CASE WHEN CalculationMonth = ''' + CharFormat + ''' THEN PLResult END)'
                        FROM    Months
                        ORDER BY M
                        FOR XML PATH(''), TYPE
                    ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + 
                'FROM   Data
                GROUP BY DenseRank
                ORDER BY DenseRank;';

EXECUTE SP_EXECUTESQL @SQL;

SQL Fiddle पर उदाहरण

कृपया ध्यान दें, मैं अभी भी इस तकनीक के खिलाफ सलाह देता हूं, और सोचता हूं कि SQL को डेटा को संग्रहीत/पुनर्प्राप्त करने और इसे स्वरूपित करने के लिए प्रस्तुति परत पर छोड़ दिया जाना चाहिए




  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. दिनांक और समय फ़ील्ड को दिनांक समय, SQL सर्वर 2008 में संयोजित करना

  3. नोड्स () विधि का उपयोग करके SQL में पदानुक्रमित XML को समतल करना

  4. एक अस्थायी तालिका में गतिशील रूप से जेनरेट की गई पिवट-तालिका प्राप्त करना

  5. एक राउंड ट्रिप के साथ SQL Server 2008 में एकाधिक आदेश कैसे भेजें