2012-06-13 5 views
-1

두 테이블이 있습니다. 하나는 상태이고 다른 하나는 직책입니다. 동적 열을 생성하는 SQL Server 쿼리

Job titles State name1 State name2 
Job title1  200   300 
Job title2  500   600 

어떻게 SQL 서버에서이 쿼리를 작성할 수 있습니다 -이 :

내가있는 것 같은 출력 내게 뭔가를하는 쿼리를 작성합니다.

답변

0

당신이 피벗 테이블

+2

동안하지 당신이 당신의 대답을 구체화 할 수 잘못? – Ben

3

을 사용해 볼 수 있습니다 SQLSERVER 2005 이상을 사용하는 경우 나 스키마가 어떻게 생겼는지 모르겠어요,하지만 당신은 세 개의 테이블이로 변경하려는 것처럼 소리 : JobTitle, 상태, 및 JobTitle_State_Salary. 그렇게하면 급여와 연계하기 위해 직책이나 주를 반복하지 않습니다.

WITH [CTE] AS 
(
    SELECT [Title], [State], [Salary] 
    FROM [JobTitle] 
     INNER JOIN [StateSalary] 
      ON [JobTitle].[ID] = [StateSalary].[JobTitleID] 
) 
SELECT 
    [Title], [State name1], [State name2] 
FROM 
    [CTE] 
    PIVOT 
    (
     MAX([Salary]) 
      FOR [State] IN ([State name1], [State name2]) 
    ) AS [P] 

SQLFiddle 예를 here :

그러나 서면으로 문제를 해결 (급여 상태로 이동하는 가정을 만들기),이 같은 트릭을 할해야합니다.

1

zimdanen이 말한 것처럼 정확한 테이블 구조를 모른 채 쿼리를 작성하는 것은 어려울 것입니다.

나는 JobTitleJobTitleIdJobTitle 필드가 구조에 대한 가정, 그리고 * state_salary * 표는, 및 필드와 같은 급여을 JobTitleId 있다.

피벗 테이블없이 피벗 테이블

SELECT * FROM (
SELECT A.JOB_TITLE,B.STATE,B.SALARY FROM dbo.JOB_TITLE A INNER JOIN dbo.STATE_SALARY B 
ON A.JOB_TITLE_ID = B.JOB_TITLE_ID)AS SOURCE_TABLE PIVOT 
(SUM(SALARY) FOR STATE IN (STATE1,STATE2)) AS PivotTable 

을 사용

SELECT A.JOB_TITLE,SUM(CASE WHEN B.STATE = 'State1' THEN B.SALARY ELSE 0 END) STATE1,  SUM(CASE WHEN B.STATE = 'State2' THEN B.SALARY ELSE 0 END) STATE2 
FROM dbo.JOB_TITLE A INNER JOIN dbo.STATE_SALARY B 
ON A.JOB_TITLE_ID = B.JOB_TITLE_ID 
GROUP BY A.JOB_TITLE