Тъй като използвате SQL Server, тогава можете да приложите функцията PIVOT и ако имате неизвестен брой стойности на периода, тогава ще трябва да използвате динамичен SQL:
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)select @cols =STUFF((SELECT distinct ',' + QUOTENAME('PeriodId'+cast(periodid as varchar(10)) ) от периоди ЗА XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')set @query ='SELECT resourcecode, ' + @cols + ', Общо от ( изберете s.resourcecode, ''PeriodId''+cast(p.periodid като varchar(10)) period, count(*) over(partition by s.resourcecode) Общо от периоди p леви графици за присъединяване s на p. periodid =s.periodid ) x pivot ( count(period) for period in (' + @cols + ') ) p където resourcecode не е нулев ред от resourcecode'execute(@query)
Вижте SQL Fiddle с демонстрация . Това дава резултат:
<предварителен код>| RESOURCECODE | ПЕРИОД1 | ПЕРИОД2 | ПЕРИОД3 | ПЕРИОД4 | ПЕРИОД5 | ПЕРИОД6 | ПЕРИОД7 | ПЕРИОД8 | ОБЩО |------------------------------------------------ -------------------------------------------------- ----------------------| 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 израз, за да трансформирате редовете с данни в колони.
Ако стойностите на вашата колона са известни, тогава можете да кодирате твърдо заявката:
изберете код на ресурс, сума (случай, когато период ='PeriodId1' след това 1 else 0 край) PeriodId1, сума (случай, когато период ='PeriodId2' след това 1 else 0 край) PeriodId2, сума (случай, когато период =' PeriodId3' след това 1 else 0 край) PeriodId3, сума (случай, когато период ='PeriodId4' след това 1 else 0 край) PeriodId4, сума (случай, когато период ='PeriodId5' след това 1 else 0 край) PeriodId5, сума (случай, когато период ='PeriodId6' след това 1 else 0 край) PeriodId6, сума (случай, когато период ='PeriodId7' след това 1 else 0 край) PeriodId7, сума (случай, когато период ='PeriodId8' след това 1 else 0 край) PeriodId8, броене (*) Общо от ( изберете concat('PeriodId', p.periodid) Период, s.resourcecode от периоди p леви графици за присъединяване s на p.periodid =s.periodid) dкъдето resourcecode не е nullgroup от resourcecode;
Вижте SQL Fiddle с демонстрация . Но ако стойностите ще бъдат неизвестни или динамични, тогава ще трябва да използвате подготвен израз, за да генерирате sql низ за изпълнение:
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 @sqlFROM periods;SET @sql =CONCAT('SELECT resourcecode, ', @sql, ' , count(*) Total from ( select concat(''PeriodId) '', p.periodid) Период, s.resourcecode от периоди p ляво присъединяване графици s на p.periodid =s.periodid ) d където resourcecode не е нулева група по resourcecode');PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE ПОДГОТВЕТЕ stmt;
Вижте SQL Fiddle с демонстрация .