-1

私には2つのテーブルがあります。1つは州で、もう1つは役職用です。

このようなものを出力するクエリを書きたい:-

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

このクエリをSQLServerで作成するにはどうすればよいですか。

4

3 に答える 3

3

スキーマがどのようなものかわかりませんが、JobTitle、State、JobTitle_State_Salary の 3 つのテーブルを持つように変更したいようです。そうすれば、給与に結び付けるために役職や州を繰り返すことはありません。

ただし、書かれているように問題に対処する (そして、給与は州と共に移動すると仮定する) と、次のような方法で問題が解決するはずです。

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 の例はこちら

于 2012-06-13T13:09:22.750 に答える
1

zimdanen が言ったように、正確なテーブル構造を知らずにクエリを書くのは難しいでしょう。

JobTitleテーブルにはJobTitleIdフィールドとJobTitleフィールドがあり、 *state_salary* テーブルにはJobTitleIdState、およびSalaryフィールドがフィールドとして含まれていると仮定しました。

ピボットテーブルの使用

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
于 2012-06-14T03:19:07.453 に答える
0

sqlserver 2005 以降を使用している場合は、ピボット テーブルを使用してみてください。

于 2012-06-13T11:59:02.067 に答える