SQL Server查询生成动态列

时间:2012-06-13 11:42:57

标签: sql-server pivot

我有两个表 - 一个是州,另一个是职称。

我想写一个查询,它会输出这样的内容: -

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

如何在SQL Server中编写此查询。

3 个答案:

答案 0 :(得分:3)

我不知道你的架构是什么样的,但听起来你想把它改成三个表:JobTitle,State和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 :(得分:1)

正如zimdanen所说,在不知道确切的表结构的情况下编写查询会很困难。

我假设 JobTitle 表具有 JobTitleId JobTitle 字段的结构,并且* state_salary *表具有 JobTitleId State Salary 作为字段。

使用PIVOT TABLE

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

答案 2 :(得分:0)

如果您使用的是sqlserver 2005或更高版本,则可以尝试使用数据透视表