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

गतिशील कॉलम के साथ एक ही पंक्ति पर एसक्यूएल एकाधिक गिनती

चूंकि आप SQL सर्वर का उपयोग कर रहे हैं तो आप PIVOT फ़ंक्शन को लागू कर सकते हैं और यदि आपके पास अज्ञात संख्या में अवधि मान हैं, तो आपको गतिशील SQL का उपयोग करने की आवश्यकता होगी:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('PeriodId'+cast(periodid as varchar(10))) 
                    from Periods
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT resourcecode, ' + @cols + ' , Total
            from 
            (
               select s.resourcecode, 
                 ''PeriodId''+cast(p.periodid as varchar(10)) period,
                count(*) over(partition by s.resourcecode) Total
               from periods p
               left join schedules s
                 on p.periodid = s.periodid
            ) x
            pivot 
            (
                count(period)
                for period in (' + @cols + ')
            ) p 
            where resourcecode is not null
            order by resourcecode'

execute(@query)

देखें SQL Fiddle with Demo . यह एक परिणाम देता है:

| RESOURCECODE | PERIODID1 | PERIODID2 | PERIODID3 | PERIODID4 | PERIODID5 | PERIODID6 | PERIODID7 | PERIODID8 | TOTAL |
------------------------------------------------------------------------------------------------------------------------
|           AA |         2 |         0 |         3 |         0 |         0 |         0 |         0 |         0 |     5 |
|           BB |         2 |         1 |         1 |         0 |         0 |         0 |         0 |         0 |     4 |
|           CC |         1 |         1 |         1 |         0 |         0 |         0 |         0 |         0 |     3 |

<स्ट्राइक> MySQL के साथ टैग किए गए आपके पिछले प्रश्न के आधार पर, मुझे लगता है कि आप MySQL को डेटाबेस के रूप में उपयोग कर रहे हैं। यदि ऐसा है, तो आपके पास PIVOT फ़ंक्शन नहीं है, इसलिए आपको डेटा की पंक्तियों को कॉलम में बदलने के लिए CASE एक्सप्रेशन के साथ एक समग्र फ़ंक्शन का उपयोग करना होगा।

यदि आपके कॉलम मान ज्ञात हैं, तो आप क्वेरी को हार्ड-कोड कर सकते हैं:

select resourcecode,
  sum(case when period = 'PeriodId1' then 1 else 0 end) PeriodId1,
  sum(case when period = 'PeriodId2' then 1 else 0 end) PeriodId2,
  sum(case when period = 'PeriodId3' then 1 else 0 end) PeriodId3,
  sum(case when period = 'PeriodId4' then 1 else 0 end) PeriodId4,
  sum(case when period = 'PeriodId5' then 1 else 0 end) PeriodId5,
  sum(case when period = 'PeriodId6' then 1 else 0 end) PeriodId6,
  sum(case when period = 'PeriodId7' then 1 else 0 end) PeriodId7,
  sum(case when period = 'PeriodId8' then 1 else 0 end) PeriodId8,
  count(*) Total
from
(
  select concat('PeriodId', p.periodid) Period,
    s.resourcecode
  from periods p
  left join schedules s
    on p.periodid = s.periodid
) d
where resourcecode is not null
group by resourcecode;

देखें SQL Fiddle with Demo . लेकिन अगर मान अज्ञात या गतिशील होंगे तो आपको निष्पादित करने के लिए एक एसक्यूएल स्ट्रिंग उत्पन्न करने के लिए तैयार कथन का उपयोग करने की आवश्यकता होगी:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(CASE WHEN period = ''',
      concat('PeriodId', periodid),
      ''' THEN 1 else 0 END) AS `',
      concat('PeriodId', periodid), '`'
    )
  ) INTO @sql
FROM periods;

SET @sql 
  = CONCAT('SELECT resourcecode, ', @sql, ' , count(*) Total
            from
            (
              select concat(''PeriodId'', p.periodid) Period,
                s.resourcecode
              from periods p
              left join schedules s
                on p.periodid = s.periodid
            ) d
            where resourcecode is not null
            group by resourcecode');


PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

देखें 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. सबक्वेरी में ऑर्डर के साथ एसक्यूएल त्रुटि

  2. स्वचालित रूप से पदानुक्रम मान उत्पन्न करें

  3. एक बहुत ही जटिल SQL क्वेरी समस्या

  4. कैसे नियंत्रित करें कि उपयोगकर्ता SQL सर्वर सममित कुंजी एन्क्रिप्शन को क्या डिक्रिप्ट कर सकते हैं

  5. कॉलम नाम और संग्रहीत प्रक्रिया के प्रकार पुनर्प्राप्त करें?