2011-12-20 11 views
0

2つのテーブルから派生したリストを生成しようとしています。最終的な結果は次のようになります。where句とサブクエリに基づくデータのリストからヘッダを派生させる方法

Date  A OHS  OMSN OMSS 
date1 1  1  2  3 
date2 4  5  6  7 
date... .. ..  ..  .. 

日付の範囲は、私が生成さcalendareテーブルのオフに生成され、右の他の建物のためにカウントされていない各建物の下には0であってもそうそれらが含まれて接合されています毎日の作業記録を数えるだけの数です。このクエリは私に特定の範囲のそれぞれの日のためのすべての場所の合計workordersを与える

Select calendar.datefield As 'Date', 
    Count(FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d')) As 'Count' 
From workorders Right Join 
    calendar On (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') = 
     calendar.datefield) 
Where calendar.datefield Between '2011-08-30' And date_format(now(), '%Y-%m-%d') 
Group By calendar.datefield 

:ここで私がこれまで持っているクエリがあります。これを含めても問題ありませんが、それぞれの特定のloctionでフィルタリングされた3つのカラムが必要です。私はこのような建物名追加する場合:

Select calendar.datefield As 'Date', workorders.location, 
    Count(FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d')) As 'Count' 
From workorders Right Join 
    calendar On (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') = 
     calendar.datefield) 
Where calendar.datefield Between '2011-08-30' And date_format(now(), '%Y-%m-%d') 
Group By calendar.datefield, workorders.location 

を次に表には、私が必要とするデータではなく、私が探しています列を与えます。

2011-09-08 OHS  27 
2011-09-09 OHS  24 
2011-09-10 NULL 0 
2011-09-11 NULL 0 
2011-09-12 OHS  23 
2011-09-13 OHS  18 
2011-09-13 OMS-N 1 
2011-09-14 OHS  20 

私は、日付を選択して、このクエリから、それはOHSで、その後の数字、それはOMSNで、その後の数字、それはOMSSで、その後の数字を引くしたい:データはこのsomethine嘘になります

これを行うにはもっと簡単な方法が必要で、私は文字通りこのクエリをまとめようと努力しました。

誰かが助けてくれることを願っています。私は過去数ヶ月にわたり、その場でmysqlを学びました。そしてどんな助けも大歓迎です。

_ _ さらにレビュー:

SELECT calendar.datefield, tOHS.Count AS 'OHS' 
FROM calendar 
LEFT JOIN (
SELTCT workorders.school, Count(workorders.dateSubmitted) AS 'Count', FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') AS test 
FROM workorders 
RIGHT JOIN calendar ON (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') = calendar.datefield) 
WHERE calendar.datefield 
BETWEEN '2011-08-30' 
AND date_format(now() , '%Y-%m-%d') 
AND School = 'OHS' 
GROUP BY calendar.datefield, workorders.school 
)tOHS ON calendar.datefield = tOHS.test 
WHERE calendar.datefield 
BETWEEN '2011-08-30' 
AND date_format(now() , '%Y-%m-%d') 

これは、日付と最初の場所OHSの毎日の数を返します。いつ私がこれを試してみますか:

select calendar.datefield, tOHS.Count as 'OHS' 
from calendar 
LEFT JOIN 
(
Select workorders.school, Count(workorders.dateSubmitted) As 'Count', FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') as test 
     From workorders Right Join 
     calendar On (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') = 
      calendar.datefield) 
    Where calendar.datefield Between '2011-08-30' And date_format(now(), '%Y-%m-%d') AND School = 'OHS' 
    Group By calendar.datefield,workorders.school 
    ) tOHS 
on calendar.datefield = tOHS.test 
LEFT JOIN 
(
Select workorders.school, Count(workorders.dateSubmitted) As 'Count', FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') as test 
     From workorders Right Join 
     calendar On (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') = 
      calendar.datefield) 
    Where calendar.datefield Between '2011-08-30' And date_format(now(), '%Y-%m-%d') AND School = 'OMS-S' 
    Group By calendar.datefield,workorders.school 
    ) tOMSS 
on calendar.datefield = tOHS.test 
WHERE calendar.datefield Between '2011-08-30' And date_format(now(), '%Y-%m-%d') 

これはすべて一緒にクエリを壊します。同じ日付が表示され、すべての列に対して同じ値が繰り返されます。間違った参加をしていますか?

+0

:-)いつか誰かに役立ちます願っています。問題は、私が2度目の参加をして、それが王立的にクエリを駄目にすることです。 - 質問の末尾に追加 – Bil1

答えて

1

数時間の研究と再考の後、私はこれを行う方法を決めました。基本的には、各フィールド(calendar.datefield、ロケーション1のカウント、ロケート2のカウント、ロケーション3のカウント)を選択する必要があります。

LEFT OUTER JOINカレンダーに正しく結合されたサブクエリこれにより、サブクエリは個々の曜日(各暦日ごとにグループ化された)のカウントを返し、(これは数秒前に述べたように)calendar.dateフィールドに外部結合された後、日付aとbの間のwhere句でフィルタリングされます。

次に、各サブクエリの左外部結合をリンスして繰り返します。私はSQLのマスターではなく、私はこれのために学校に行ったことがないので、最適化されていたり、完璧ではないかもしれませんが、それはかなりうまく動作しています。私はそれを理解しただけでうれしいです。

select calendar.datefield, (ifnull(tOHS.Count,0)+ifnull(tOMSS.Count,0)+ifnull(tOMSN.Count,0)) as 'Total', ifnull(tOHS.Count,0) as 'OHS', ifnull(tOMSS.Count,0) as 'OMS-S', ifnull(tOMSN.Count,0) as 'OMS-N' 
from calendar 

LEFT OUTER JOIN 
(
Select workorders.school, Count(workorders.dateSubmitted) As 'Count', FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') as 'Date' 
     From workorders Right Join 
     calendar On (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') = 
      calendar.datefield) 
    Where School = 'OHS' 
    Group By calendar.datefield,workorders.school 
    ) tOHS 
on calendar.datefield = tOHS.Date 

LEFT OUTER JOIN 
(
Select workorders.school, Count(workorders.dateSubmitted) As 'Count', FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') as 'Date' 
     From workorders Right Join 
     calendar On (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') = 
      calendar.datefield) 
    Where School = 'OMS-S' 
    Group By calendar.datefield,workorders.school 
    ) tOMSS 
on calendar.datefield = tOMSS.Date 

LEFT OUTER JOIN 
(
Select workorders.school, Count(workorders.dateSubmitted) As 'Count', FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') as 'Date' 
     From workorders Right Join 
     calendar On (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') = 
      calendar.datefield) 
    Where School = 'OMS-N' 
    Group By calendar.datefield,workorders.school 
    ) tOMSN 
on calendar.datefield = tOMSN.Date 


WHERE calendar.datefield Between '2011-08-30' And date_format(now(), '%Y-%m-%d') 

これは、範囲aからbまでの日付を返し、3つの建物と各建物の合計を返します。私は4つの建物を持っていますが、LEFT OUTER JOINをコピーしてon節に貼り付け、変数を変更してその数を新たに選択することで、必要な数だけ追加するのは簡単です。

この記事は紛らわしいことがあります。それは私が、私はそれはそれでフィルタをサブクエリに参加している参加を使って探しています何に近いものを生成することができた更なる検討の際に

ビリルビン

関連する問題