Я создал такую таблицу с некоторыми данными.
DROP TABLE IF EXISTS #EmployeeDetail
CREATE TABLE #EmployeeDetail(Name nvarchar(50),Department nvarchar(50),IsActive INT)
INSERT INTO #EmployeeDetail(Name,Department,IsActive)
VALUES ( 'John','Account', 1 ), ( 'Harry', 'Store', 0), ( 'Smile', 'HR', 1);
Результат запроса
Name | Department | IsActive |
---|---|---|
John | Account | 1 |
Harry | Store | 0 |
Smile | HR | 1 |
Затем я сделал поворот, где строка становится столбцом, используя этот запрос
DECLARE
@columns NVARCHAR(MAX) = '',
@sql NVARCHAR(MAX) = '';
DROP TABLE IF EXISTS #EmployeeDetail
CREATE TABLE #EmployeeDetail(Name nvarchar(50),Department nvarchar(50),IsActive INT)
INSERT INTO #EmployeeDetail(Name,Department,IsActive)
VALUES ( 'John','Account', 1 ), ( 'Harry', 'Store', 0), ( 'Smile', 'HR', 1);
SELECT
@columns+=QUOTENAME(Department) + ','
FROM #EmployeeDetail;
SET @columns = LEFT(@columns, LEN(@columns) - 1);
DECLARE @GrandTotalCol NVARCHAR (MAX)
SELECT @GrandTotalCol = COALESCE (@GrandTotalCol + 'ISNULL ([' +
CAST (Department AS VARCHAR) +'],0) + ', 'ISNULL([' + CAST(Department AS VARCHAR)+ '],0) + ')
FROM #EmployeeDetail
GROUP BY Department
ORDER BY Department;
SET @GrandTotalCol = LEFT (@GrandTotalCol, LEN (@GrandTotalCol)-1);
SET @sql ='
SELECT *, (' + @GrandTotalCol + ')
AS [Grand Total] INTO #temp_MatchesTotal FROM
(
SELECT
Name,
Department
FROM #EmployeeDetail
) t
PIVOT(
COUNT(Department)
FOR Department IN ('+ @columns +')
)
AS pivot_table
SELECT * FROM #temp_MatchesTotal
DROP TABLE #temp_MatchesTotal
;';
EXECUTE sp_executesql @sql;
который дает вывод следующим образом:
Name | Account | Store | HR | Grand Total |
---|---|---|---|---|
John | 0 | 1 | 0 | 1 |
Harry | 1 | 0 | 0 | 1 |
Smile | 0 | 0 | 1 | 1 |
Теперь, кажется, все было хорошо до этого, но теперь я хочу извлечь таблицу в такой отчет:
Есть ли способ добиться такого типа вещей с помощью запроса? Чтобы я мог легко отображать извлеченные данные в отчет. Здесь сводной столбец также фильтруется по столбцу IsActive в таблице #EmployeeDetail.