Вам понадобится использовать динамический SQL, чтобы выяснить, какие столбцы вы хотите отобразить, если вы не знаете полный набор возможных значений национальности.
DECLARE @start DATETIME, @end DATETIME;
SET @start = '20120802';
SET @end = '20120802';
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT Room_No, Study_Date,
Male = SUM(CASE WHEN Student_Sex = ''Male'' THEN 1 ELSE 0 END),
Female = SUM(CASE WHEN Student_Sex = ''Female'' THEN 1 ELSE 0 END)';
SELECT @sql = @sql + CHAR(13) + CHAR(10) +
',' + Nationality + ' = SUM(CASE WHEN Nationality = '''
+ Nationality + ''' THEN 1 ELSE 0 END)'
FROM dbo.vStudent
WHERE Nationality IS NOT NULL
GROUP BY Nationality;
SET @sql = @sql + ' FROM dbo.vStudent
WHERE Study_Date >= '''
+ CONVERT(CHAR(8), @start, 112) + '''
AND Study_Date < '''
+ CONVERT(CHAR(8), DATEADD(DAY, 1, @end), 112) + '''
GROUP BY Room_No, Study_Date;';
EXEC sp_executesql @sql;
Если набор национальностей известен, то вы можете просто сказать:
SELECT
Room_No, Study_Date,
Male = SUM(CASE WHEN Student_Sex = 'Male' THEN 1 ELSE 0 END),
Female = SUM(CASE WHEN Student_Sex = 'Female' THEN 1 ELSE 0 END),
Cambodian = SUM(CASE WHEN Nationality = 'Cambodian' THEN 1 ELSE 0 END),
Chinese = SUM(CASE WHEN Nationality = 'Chinese' THEN 1 ELSE 0 END),
Thailand = SUM(CASE WHEN Nationality = 'Thailand' THEN 1 ELSE 0 END)
-- continue other nationalities here
FROM dbo.vStudent
WHERE Study_Date >= @start
AND Study_Date < DATEADD(DAY, 1, @end)
GROUP BY Room_No, Study_Date;
Возможно, вы могли бы сделать это немного более элегантно с PIVOT
, но это действительно зависит от вашего определения "элегантный". См. документы здесь .