2016-05-26 6 views
1

私はMySQLのクエリを初めて熟読しています。MySQL NULLを取得せずに結果を1つの行に均等に配置する方法

私は一般的にこのように見えるが、より多くのデータを持つ3つのテーブルがあり、最終的なクエリはここにある1つのホスト名によって制限されません。私は単純化しようとしています。

infrastructure_serverテーブル

id | hostname 
1 ld0007 

infrastructure_server_jobsテーブル

server_id | job_id 
1    1 
1    2 

ここ

id | end_date 
1  2015-12-21 09:51:56 
2  2016-01-27 10:02:36 

jobs_jobテーブルが私のクエリです:

SELECT 
    CASE WHEN type = "provision" THEN CAST(end_date AS DATE) END AS ProvDate, 
    CASE WHEN type = "decom" THEN CAST(end_date AS DATE) END AS DecomDate, 
    infserver.hostname as HostName 

FROM 
    infrastructure_server infserver 

inner join infrastructure_server_jobs sj on infserver.id = sj.server_id 
inner join jobs_job jj on sj.job_id = jj.id 

where 
infserver.status != "PROVFAILED" 
AND 
infserver.group_id ="2" 
AND 
infserver.hostname ="ld0007" 

私の結果は以下のとおりです。

ProvDate, DecomDate, HostName 
'2015-12-21', NULL, 'ld0007' 
NULL, '2016-01-27', 'ld0007' 

私はホスト名でグループを追加する場合、それは一つの行にそれを平らに私はDecomDate失う:

ProvDate, DecomDate, HostName 
'2015-12-21', NULL, 'ld0007' 

を、私は結果がする必要がどのようなものですホスト名ごとに1つの行:

ProvDate, DecomDate, HostName 
'2015-12-21', '2016-01-27', 'ld0007' 

はThorsten、カラム型がjobs_jobテーブルです。私が使用しているツールはMySQl Workbenchです。私はオリジナルのポストでMAX()(アウトしてクエリを実行し、ここでinfserver.hostname =「ld0007」を削除した場合、私はそれにカウンターを追加した場合、私は戻って

ProvDate, DecomDate, HostName 
'2016-01-28', NULL, 'ld0043' 
NULL, '2016-01-29', 'ld0043' 
'2016-01-28', NULL, 'ld0044' 
NULL, '2016-03-30', 'ld0044' 
'2016-01-28', NULL, 'ld0045' 
NULL, '2016-03-30', 'ld0045' 
'2016-01-28', NULL, 'ld0046' 
NULL, '2016-01-28', 'ld0046' 
'2016-01-28', NULL, 'ld0047' 
NULL, '2016-01-29', 'ld0047' 
'2016-01-29', NULL, 'ld0048' 
NULL, '2016-03-14', 'ld0048' 
'2016-01-29', NULL, 'ld0049' 
NULL, '2016-02-09', 'ld0049' 
'2016-01-29', NULL, 'ld0050' 
NULL, '2016-03-31', 'ld0050' 
'2016-01-29', NULL, 'ld0051' 
NULL, '2016-01-29', 'ld0051' 
'2016-01-29', NULL, 'ld0052' 
NULL, '2016-01-29', 'ld0052' 
'2016-01-29', NULL, 'ld0053' 
NULL, '2016-01-29', 'ld0053' 

を取得した行のいくつかであるI私はMAX()を追加すると1989行の合計を取り戻す。私は1つのレコードのみ取り戻す

SET @counter = 0; 
SELECT 
    (@counter:= @counter + 1) as counter, 
    CASE WHEN type = "provision" THEN CAST(end_date AS DATE) END AS ProvDate, 
    CASE WHEN type = "decom" THEN CAST(end_date AS DATE) END AS DecomDate, 
    infserver.hostname as HostName 
FROM 
    infrastructure_server infserver 
inner join infrastructure_server_jobs sj on infserver.id = sj.server_id 
inner join jobs_job jj on sj.job_id = jj.id 
where 
infserver.status != "PROVFAILED" 
AND 
infserver.group_id ="2" 
+0

どのテーブルが 'type'列ですか? –

+0

はい、「MAX」などの集計関数は、行を1つの結果行に集約します。ホスト名ごとに1つの結果行が必要な場合は、回答に示されているようにホスト名でグループ化します。 –

+0

ありがとう私は私の質問でそれが欠けていたことに気付いた。それは働いている!再度、感謝します! – Jockser

答えて

0

ホスト名でグループ化するとき、あなたは、ホスト名ごとに1つの結果行を取得。あなたは、例えばProvDateを選択した場合、あなたが得ます1つのProvDate - したがって、あなたが何を指定していない限り、MAXのような集計関数を使用して、どちらを取得したいかを指定します。そして、MAXはnullを無視します。あなたのすべての問題:-)

SELECT 
    MAX(CASE WHEN type = 'provision' THEN CAST(end_date AS DATE) END) AS ProvDate, 
    MAX(CASE WHEN type = 'decom' THEN CAST(end_date AS DATE) END) AS DecomDate, 
    infserver.hostname as HostName 
FROM infrastructure_server infserver 
INNER JOIN infrastructure_server_jobs sj on infserver.id = sj.server_id 
INNER JOIN jobs_job jj on sj.job_id = jj.id 
where infserver.status <> 'PROVFAILED' 
AND infserver.group_id = 2 
AND infserver.hostname = 'ld0007' 
group by infserver.hostname; 
関連する問題