Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Множествено броене на един и същи ред с динамична колона

Тъй като използвате 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 с демонстрация .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не може да се използва специалният принципал 'sa'

  2. Извличане на идентификатора на вмъкнат запис:Php &MS SQL SERVER

  3. Как да съхранявате директория/йерархия/дървовидна структура в базата данни?

  4. Entity Framework - Получаване на дължината на данните в текстова колона

  5. Актуализирайте стойността на първичния ключ с помощта на рамката на обекта