चूंकि आप 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 ।