2012-06-13 194 views
-1

我有两个表 - 一个是状态,另一个是Job标题。SQL Server查询生成动态列

我想编写一个查询将输出我是这样的: -

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

我怎么能写在SQL Server此查询。

回答

0

如果您使用SQLSERVER 2005或更大,你可以尝试使用数据透视表

+2

虽然不是不正确,你可以充实你的答案? – Ben

3

我不知道您的架构看起来像,但它听起来像是你想改变它有三个表: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所说,在不知道确切的表结构的情况下编写查询将会很困难。

我假设结构JOBTITLE表有JobTitleIdJOBTITLE字段和* 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