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

sql:कॉलम के रूप में पंक्तियों का मान

डायनामिक पिवोटिंग का उपयोग करके आपकी समस्या का समाधान किया जा सकता है। कृपया इसे देखें लेख

इसे आजमाएं

DECLARE @t TABLE(Id_Contract INT, Dt DATETIME,Amount INT)
INSERT INTO @t SELECT 1,'2012-01-01 00:00:00.000',500
INSERT INTO @t SELECT 1,'2012-03-01 00:00:00.000',450
INSERT INTO @t SELECT 2,'2012-09-01 00:00:00.000',300
INSERT INTO @t SELECT 3,'2012-08-01 00:00:00.000',750

DECLARE @cols AS VARCHAR(MAX), @query  AS VARCHAR(MAX);

SELECT 
    Id_Contract
    , LEFT(DATENAME(month,Dt),3) + ' ' + DATENAME(Year,Dt) AS Month_Year_Name
    ,Amount
INTO #Temp
FROM @t 
WHERE Dt BETWEEN  '01/01/2012' AND '03/31/2012'

SELECT  @cols = STUFF(( SELECT DISTINCT 
                               '],[' +   t2.Month_Year_Name
                        FROM    #Temp AS t2
                        ORDER BY '],[' + t2.Month_Year_Name
                        FOR XML PATH('')
                      ), 1, 2, '') + ']'

SET @query = 'SELECT Id_Contract, ' + @cols + ' FROM 
            (
                SELECT
                     Id_Contract
                    , Amount
                    , Month_Year_Name
                FROM #Temp
           ) x
            PIVOT 
            (
                 MAX(amount)
                 FOR Month_Year_Name in (' + @cols + ')
            ) p '
EXECUTE(@query)
DROP TABLE #Temp

// परिणाम

Id_Contract Jan 2012    Mar 2012
1           500         450

संपादित करें

आपके परीक्षण डेटा के लिए,

DECLARE @t TABLE(Id_Contract INT, Dt DATETIME,Amount INT) 
INSERT INTO @t SELECT 1,'2012-01-01 00:00:00.000',500 
INSERT INTO @t SELECT 1,'2012-03-01 00:00:00.000',450 
INSERT INTO @t SELECT 2,'2012-03-01 00:00:00.000',450 
INSERT INTO @t SELECT 3,'2012-08-01 00:00:00.000',750 

आउटपुट है

Id_Contract Jan 2012    Mar 2012
1              500          450
2              NULL         450

मुझे बताएं कि क्या यह आवश्यकता को पूरा करता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ExecuteReader को एक खुले और उपलब्ध कनेक्शन की आवश्यकता है। कनेक्शन की वर्तमान स्थिति कनेक्ट हो रही है

  2. डीबी में डेटा सहेजें

  3. एक विशिष्ट तालिका के बिना MSSQL डेटाबेस बैकअप

  4. एमएस एसक्यूएल में पिछले 30 मिनट के रिकॉर्ड कैसे प्राप्त करें?

  5. तालिका चर CTE में डालें