2

次のようなテーブル(MySQL)があるとします。

CREATE TEMPORARY table IF NOT EXISTS tbl  
(   
    REF_REQ_ID int AUTO_INCREMENT PRIMARY KEY,
    FunctionalArea varchar(200),
    Industry varchar(200)
);

INSERT INTO tbl
SELECT 1, 'IT Jobs', 'IT related Jobs' UNION ALL
SELECT 2, 'HR Jobs', NULL UNION ALL
SELECT 3, NULL, 'HR related Jobs' UNION ALL
SELECT 4, NULL, 'IT related Jobs' UNION ALL
SELECT 5, NULL, NULL UNION ALL
SELECT 6, 'IT Jobs', 'IT related Jobs' UNION ALL
SELECT 7, 'HR Jobs', NULL UNION ALL
SELECT 8, NULL, 'HR related Jobs' UNION ALL
SELECT 9, 'HR Jobs', NULL;

2つの列を1つの列(distinct値)に結合して結合し、並べ替えたいのですがNoOfJobs、どうすればそれを実現できますか?

期待される結果

JobTitle         NoOfJobs
HR Jobs           3
IT related Jobs   3
HR related Jobs   2
IT Jobs           2

質問や質問の内容が適切でない場合はコメントしてください。

日付ベースはMySQLです。SQLServerでこれを実現する方法を知っています。

このクエリを実行するだけです(MS SQL Serverの場合):

DECLARE  @tbl  table
(   
    REF_REQ_ID int IDENTITY(1,1),
    FunctionalArea varchar(200),
    Industry varchar(200)
)

INSERT INTO @tbl
SELECT 'IT Jobs', 'IT related Jobs' UNION ALL
SELECT 'HR Jobs', NULL UNION ALL
SELECT NULL, 'HR related Jobs' UNION ALL
SELECT NULL, 'IT related Jobs' UNION ALL
SELECT NULL, NULL UNION ALL
SELECT 'IT Jobs', 'IT related Jobs' UNION ALL
SELECT 'HR Jobs', NULL UNION ALL
SELECT NULL, 'HR related Jobs' UNION ALL
SELECT 'HR Jobs', NULL

SELECT 
    JobTitle As JobTitle,
    COUNT(REF_REQ_ID) As NoOfJobs
FROM    
    (SELECT 
        FunctionalArea As JobTitle,
        REF_REQ_ID
    FROM @tbl
    UNION 
    SELECT 
        Industry As JobTitle,
        REF_REQ_ID
    FROM @tbl)t
WHERE JobTitle IS NOT NULL
GROUP BY JobTitle
ORDER BY NoOfJobs desc

UNIONそれは私が期待した結果を私に与えるでしょう、しかし残念ながらMySQLは同じテーブルでサポートしていません(一時的)。

MySQLリーダー:期待される結果を達成するにはどうすればよいですか?

SQL Serverリーダー:同じことを行う別の方法はありますか?

4

4 に答える 4

0
select * from (
select FunctionalArea as JobTitle,count(1) as NoOfJobs
from tbl
where FunctionalArea IS NOT NULL
group by FunctionalArea
UNION ALL
select Industry as JobTitle,count(1)as NoOfJobs
from tbl
where Industry IS NOT NULL
group by Industry) t
order by t.NoOfJobs desc

結果

JobTitle         NoOfJobs
HR Jobs           3
IT related Jobs   3
HR related Jobs   2
IT Jobs           2

デモはこちら

注:デモsqlfiddleでは異なるテーブル名を使用しました。

于 2013-02-28T10:12:46.293 に答える
0

最も簡単な解決策は、一時テーブルの代わりに実際のテーブルを作成することです。

完了時にテーブルを削除することを忘れない限り、またテーブル名が他のテーブル名と衝突しない限り、違いはありません。

この質問にはそれについての素晴らしい議論があり、別の回避策も示しています(ただし、私の意見では、他の回避策は実際のテーブルを使用するよりもはるかに厄介です)。

更新:別の可能性は、一時テーブルの前に和集合が発生するように再設計することです。一時テーブルは、和集合操作の結果で満たされる可能性があります。それが理にかなっているかどうかは、コードの残りの部分に依存します。

于 2013-02-28T10:14:01.103 に答える
0

同じクエリでTEMPORARYテーブルを複数回参照することはできません。たとえば、次は機能しません。

mysql> SELECT * FROM temp_table, temp_table AS t2;
ERROR 1137: Can't reopen table: 'temp_table'

参照

@dan1111ソリューションはよさそうだ。

于 2013-02-28T10:25:14.017 に答える
0

私は答えを投稿しています、それは私に期待される結果を与えます、そしてすべてに感謝します。

一時テーブルをもう1つ追加しました(実際のテーブルではありません)

CREATE TEMPORARY table IF NOT EXISTS tbl  
(   
    REF_REQ_ID int AUTO_INCREMENT PRIMARY KEY,
    FunctionalArea varchar(200),
    Industry varchar(200)
);

TRUNCATE TABLE tbl;

INSERT INTO tbl
SELECT 1, 'IT Jobs', 'IT related Jobs' UNION ALL
SELECT 2, 'HR Jobs', NULL UNION ALL
SELECT 3, NULL, 'HR related Jobs' UNION ALL
SELECT 4, NULL, 'IT related Jobs' UNION ALL
SELECT 5, NULL, NULL UNION ALL
SELECT 6, 'IT Jobs', 'IT related Jobs' UNION ALL
SELECT 7, 'HR Jobs', NULL UNION ALL
SELECT 8, NULL, 'HR related Jobs' UNION ALL
SELECT 9, 'HR Jobs', NULL;

CREATE TEMPORARY table IF NOT EXISTS tbl_industry
(   
    REF_REQ_ID int,
    Industry varchar(200)
);

TRUNCATE TABLE tbl_industry;

INSERT INTO tbl_industry
SELECT 
    REF_REQ_ID,
    Industry 
FROM tbl
WHERE Industry IS NOT NULL;


SELECT 
    JobTitle As JobTitle,
    COUNT(REF_REQ_ID) As NoOfJobs
FROM    
    (SELECT 
        FunctionalArea As JobTitle,
        REF_REQ_ID
    FROM tbl
    UNION 
    SELECT 
        Industry As JobTitle,
        REF_REQ_ID
    FROM tbl_industry)t
WHERE JobTitle IS NOT NULL
GROUP BY JobTitle
ORDER BY NoOfJobs desc
于 2013-02-28T10:43:04.553 に答える