我有两个表 - 一个是州,另一个是职称。
我想写一个查询,它会输出这样的内容: -
Job titles State name1 State name2
Job title1 200 300
Job title2 500 600
如何在SQL Server中编写此查询。
答案 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或更高版本,则可以尝试使用数据透视表