3

毎月の回転リテイナーの情報を計算するクエリがあります。プロジェクトには、月ごとに一定の時間数が割り当てられており、期間は月のさまざまな時間に開始されます (たとえば、2 月 5 日から 3 月 4 日まで)。クエリ結果の列は次のとおりです。

  1. プロジェクト名
  2. 記録された合計時間
  3. 月間残り時間
  4. 生理の最終日
  5. 残存日数

たとえば、プロジェクト A には 15 時間が記録されており、1 か月の期間は残り 5 時間です。期間の最終日は 11 月 17 日で、今日から残り 3 日です。

現在のクエリは、左結合を使用して結合された 4 つのテーブルを取得して、記録された時間がなくてもすべてのクライアントを出力し、ネストされたサブクエリ (8 ~ 86 行目) を使用して列 2、3、4、および 5 を計算します。ただし、列 4 と 5 は印刷されず、常に NULL と表示されます。(これらは期間の最終日と残りの日数です)。

ここの SQL フィドル リンクでスキーマとクエリ コードを確認できます: http://sqlfiddle.com/#!2/fc830/12

記録された時間数がない場合に、列 4 と 5 を取得してデータを印刷し、null にしないようにするにはどうすればよいですか? 追加の左結合が必要になる可能性があると思いますが、解決策を得ることができません。何か提案があれば、よろしくお願いします。ありがとう!

4

2 に答える 2

2

記録された時間がない場合、ネストされたクエリへの左結合は、問題のある列に対して null を返します。

答えは、null の場合は値を提供しifnull()、左結合が null を返す場合はそれらの値を使用することです。

select
...
ifnull(<left joined value>, <value when there's no join>),
...

sqlfiddleの実用的なソリューションを参照してください。


ちなみに、内部クエリから返されるいくつかの値、特に「最後の日」の値は直接導出できますclient(私のソリューションに見られるように)。クエリはできるだけ単純にするのが最善です。より単純で直接的な方法がある場合は、複雑な方法でデータを取得しないでください。

于 2012-11-14T18:13:35.490 に答える
1

あなたは の考えに徹底していないと思いますLEFT JOINLEFT JOIN外部テーブルのすべての行になります。それ以外の場合はLEFT Outer JOIN( とは逆にRIGHT OUTER JOIN) と呼ばれます。あなたの場合、内部クエリは client id = 4 のレコードのみになります。最後の節を参照してくださいX on X.id=client.id。さて、結果はどうなると思いますか?

OUTER TABLE (client table)
id = 1, 2, 3, 4

INNER TABLE 
client id = 4

ON X.id=client.id

INNER JOINid = 4 の場合、一致するレコードは 1 つしかないため、anは 1 つのレコードになります。

ただし、LEFT JOIN を実行すると、外部テーブルの 4 つのレコードすべてが返されますが、無効なフィールドの値はNULL. ここでは、クライアント ID 4 を除いて、内部テーブルからの有効なレコードがないため、null になります。

より明確にするために、レコードに沿って id フィールドを確認する必要があります。このフィドルを試してください

これらのフィールドに入力する方法については、他の回答を見ることができNULLます..

于 2012-11-14T18:15:52.127 に答える