Karena Anda menggunakan SQL Server maka Anda dapat mengimplementasikan fungsi PIVOT dan jika Anda memiliki jumlah nilai periode yang tidak diketahui, maka Anda perlu menggunakan SQL dinamis:
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)
Lihat SQL Fiddle dengan Demo . Ini memberikan hasil:
| 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 |
Berdasarkan pertanyaan Anda sebelumnya yang ditandai dengan MySQL, saya berasumsi Anda menggunakan MySQL sebagai database. Jika demikian, maka Anda tidak memiliki fungsi PIVOT sehingga Anda harus menggunakan fungsi agregat dengan ekspresi CASE untuk mengubah baris data menjadi kolom.
Jika nilai kolom Anda diketahui, Anda dapat membuat hard-code kueri:
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;
Lihat SQL Fiddle dengan Demo . Tetapi jika nilainya tidak diketahui atau dinamis maka Anda perlu menggunakan pernyataan yang disiapkan untuk menghasilkan string sql untuk dieksekusi:
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;
Lihat SQL Fiddle dengan Demo .