MSSQL 쿼리에서 데이터를 피벗하고 PHP보기로 가져 오는 방법
다음과 같은 쿼리 콘텐츠가있는 MSSQL 2005 데이터베이스가 있습니다.
노파 | 암호 | 이름 | 주문 |
---|---|---|---|
00115301 | D031 | 아담 | 1 |
00130015 | D031 | 아담 | 2 |
00149998 | D026 | 제임스 | 1 |
00149970 | D028 | 피키 | 1 |
00142641 | D028 | 피키 | 2 |
00127700 | D028 | 피키 | 삼 |
보고서를 위해 다음과 같은 테이블 출력이 필요합니다.
아담 | 제임스 | 피키 | ... (동적 콘텐츠 기반 신기록) |
---|---|---|---|
00115301 | 00149998 | 00149970 | ... |
00130015 | - | 00142641 | ... |
- | - | 00127700 | ... |
누구든지 나를 도울 수 있습니까 ??
답변
CASE
문 으로 피벗을 할 수 있습니다 . 기본적으로 수동 피벗 방법이며 2005 년 이전 버전의 SQL Server를 사용하고 있었다면 해당 경로로 이동해야합니다. SQL Server 2005는 PIVOT 함수를 추가했습니다 .
동적이어야하므로 동적 SQL 을 사용해야 합니다. 그것은 많은 다리 작업이지만 확실히 할 수 있습니다.
전역 임시 테이블 (동적 SQL에서 작동하려면 전역이어야 함)에 테이블 내용을 만들 것입니다.
-- CREATE GLOBAL TEMPORARY TABLE
CREATE TABLE ##tablename (
[nopas] VARCHAR(8),
[code] VARCHAR(4),
[name] VARCHAR(64),
[order] SMALLINT
);
INSERT INTO ##tablename
([nopas], [code], [name], [order])
VALUES
('00115301','D031','ADAM', 1)
,('00130015','D031','ADAM', 2)
,('00149998','D026','JAMES', 1)
,('00149970','D028','FIKI', 1)
,('00142641','D028','FIKI', 2)
,('00127700','D028','FIKI', 3);
다음으로, SELECT
고유 한 이름을 다른 임시 테이블 IDENTITY
에 넣고 for 루프에서 반복 할 수있는와 연결합니다.
SELECT IDENTITY(INT, 1,1) as [id], [name]
INTO #temp
FROM ##tablename
GROUP BY [name];
이제 어려운 부분이 있습니다. 은 PRINT @dynSQL
내가 동적으로 (아래) 달성하기 위해 노력하고있어 생성합니다. 우리는 필요 , ,과 에 대한 최종 결과. 우리는 성명서의 두 번째 부분에서 에 피봇 팅 하고 ; 그러나 원래 테이블 콘텐츠에 그룹화 가 포함되어 있기 때문에 단일 행 의 값을 기준으로 만 검색합니다 . 따라서 결과적으로 집계가 제거됩니다. 당신이하지 않은 경우 원본 콘텐츠에 열을, 우리는 사용해야합니다 ROW_NUMBER () 함수를 * (가) 저를 생성 .SELECT
[order]
[name]
[nopas]
[name]
MAX([nopas])
[order]
MAX([nopas])
MAX
[order]
PARTITIONED BY
[name]
[order]
편집 :이 ROW_NUMBER()
기능은 SQL Server 2012 이상에서만 사용할 수 있음을 발견했습니다 .
-- PRINT @dynSQL result
SELECT * FROM
(SELECT [order], [name], [nopas]
FROM ##tablename) AS sourceTable
PIVOT(
MAX([nopas])
FOR [name] IN ([ADAM],[FIKI],[JAMES])
) AS pivotTable;
-- The leg work to create the dynamic SQL.
DECLARE @count INT = 1;
DECLARE @max INT = (SELECT MAX(id) FROM #temp);
DECLARE @dynSQL VARCHAR(2048) = 'SELECT * FROM
(SELECT [order], [name], [nopas]
FROM ##tablename) AS sourceTable
PIVOT(
MAX([nopas])
FOR [name] IN (';
SET @count = 1;
WHILE(@count <= @max)
BEGIN
SET @dynSQL += '[' + (SELECT [name] FROM #temp WHERE id = @count) + '],';
SET @count += 1;
END
SET @dynSQL = LEFT(@dynSQL, DATALENGTH(@dynSQL) -1) + ')
) AS pivotTable;';
PRINT @dynSQL;
EXEC (@dynSQL);
DROP TABLE ##tablename;
DROP TABLE #temp;
아, [order]
결과에서 열 을 제거하려면 . SELECT * INTO ##newGlobalTable
동적 SQL에서 사용할 수 있고 ALTER
새 테이블과 DROP
열 에서 사용할 수 있습니다 .