당신은 조건부 집계로이 작업을 수행 할 수 있습니다
편집
여기에 내 현재 쿼리입니다.
SELECT
ProductName,
SUM(CASE WHEN Name = 'Documents' THEN 1 ELSE 0 END) as NumOfDocuments,
SUM(CASE WHEN Name = 'DVD' THEN 1 ELSE 0 END) as NumOfDVD,
SUM(CASE WHEN Name = 'Poster' THEN 1 ELSE 0 END) as NumOfPoster
FROM
YourTable
GROUP BY ProductName
동적 SQL
IF OBJECT_ID('tempdb..#Clients') IS NOT NULL DROP TABLE #Clients
IF OBJECT_ID('tempdb..#Products') IS NOT NULL DROP TABLE #Products
IF OBJECT_ID('tempdb..#Projects') IS NOT NULL DROP TABLE #Projects
IF OBJECT_ID('tempdb..#ProjectTypes') IS NOT NULL DROP TABLE #ProjectTypes
CREATE TABLE #Clients (ID int, Name varchar(64))
CREATE TABLE #Products (ID int, Name varchar(64), ClientID int)
CREATE TABLE #Projects (ID int, Name varchar(64), ProductID int, ProjectTypeID int)
CREATE TABLE #ProjectTypes (ID int, Name varchar(64))
INSERT INTO #Clients (ID, Name) VALUES
(1,'Client1'),
(2,'Client2'),
(3,'Client3'),
(4,'Client4')
INSERT INTO #Products (ID, Name, ClientID) VALUES
(1,'Prod1',1),
(2,'Prod2',1),
(3,'Prod3',1),
(2,'Prod2',2),
(2,'Prod2',3),
(3,'Prod3',3),
(4,'Prod3',3)
INSERT INTO #Projects (ID, Name, ProductID, ProjectTypeID) VALUES
(1,'Proj1',1,1),
(1,'Proj1',2,1),
(1,'Proj1',3,1),
(2,'Proj2',2,2),
(2,'Proj2',3,2),
(2,'Proj2',4,2),
(3,'Proj3',4,3)
INSERT INTO #ProjectTypes (ID, Name) VALUES
(1,'ProjType1'),
(2,'ProjType2'),
(3,'ProjType3')
IF OBJECT_ID('tempdb..#Summary') IS NOT NULL DROP TABLE #Summary
SELECT
c.ID,
prod.Name as ProductName,
proj.Name as ProjectName,
projT.Name as ProjType
INTO #Summary
FROM #Clients c
INNER JOIN
#Products prod on prod.ClientID = c.ID
INNER JOIN
#Projects proj on proj.ProductID = prod.ID
INNER JOIN
#ProjectTypes projT on projT.ID = proj.ProjectTypeID
SELECT * FROM #Summary
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME(ProjType)
FROM (SELECT DISTINCT ProjType FROM #Summary) AS Names
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
N'SELECT ProductName, ' + @ColumnName + '
FROM #Summary
PIVOT(COUNT(ProjType)
FOR ProjType IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
그래서 테이블을 사용하여, 당신은 단지이 ... 그것은 약간의 조정이 필요할 수 있습니다 실행할 수 있어야합니다.
IF OBJECT_ID('tempdb..#Summary') IS NOT NULL DROP TABLE #Summary
SELECT
c.ID,
prod.Name as ProductName,
proj.Name as ProjectName,
projT.Name as ProjType
INTO #Summary
FROM Clients c
INNER JOIN
Products prod on prod.ClientID = c.ID
INNER JOIN
Projects proj on proj.ProductID = prod.ID
INNER JOIN
ProjectTypes projT on projT.ID = proj.ProjectTypeID
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME(ProjType)
FROM (SELECT DISTINCT ProjType FROM #Summary) AS Names
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
N'SELECT ProductName, ' + @ColumnName + '
FROM #Summary
PIVOT(COUNT(ProjType)
FOR ProjType IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
Tutorial
시도'COUNT()''GROUP BY' – Shnugo
과 관련이 동적 피벗을 원하는 것 같다? – Monah
@ Shnugo 나는 당신이 나를 더 가까이에 두었다고 생각한다! 감사! – theDaviator