2017-04-18 1 views
0

私はかなりMySQLに慣れていて、別のテーブルのカラムのデータによって1つのテーブルのカラムからデータを分割する必要があるクエリに取り組んでいます。私はサイトの周りの良い狩りを持っていますが、私が探しているものを見つけることができません(またはそれは私の部分の理解の欠如かもしれません)。私はTotalSpendをTotalHiresで割り、私がかなり近いと思っていますが、そうではありません。1つのテーブルの列のデータを別のテーブルの列のデータで分割するにはどうすればよいですか?

私は各列に4行のデータを持ち、実行する計算を4つ探しています。現在16の結果が返されています。私は、同じメンバIDに関連するデータを分割したいが、一方の列の各セルが他方の列の各セルによって分割されていると考える。 希望する4つの計算だけを返すようにコードを変更するにはどうすればよいですか?

総支出:

SELECT garment_hire_header.member_id, garment_hire_line.hire_id, SUM(garment_hire_line.days*catalogue.daily_rate) AS 'Total Spend' 
FROM garment_hire_line 
JOIN garment_hire_header ON garment_hire_line.hire_id = garment_hire_header.hire_id 
JOIN garment ON garment_hire_line.garment_id = garment.garment_id 
JOIN catalogue ON garment.catalogue_id = catalogue.catalogue_id 
Group by garment_hire_header.member_id 

TotalHires:ほぼ最終的なコードを作業

SELECT garment_hire_header.member_id, COUNT(garment_hire_header.hire_id) as TotalHires 
FROM garment_hire_header 
Group by garment_hire_header.member_id 

は(16回の計算を返す):今すぐ

SELECT s.TotalSpend/h.TotalHires 
from (SELECT SUM(garment_hire_line.days*catalogue.daily_rate) AS TotalSpend 
FROM garment_hire_line 
JOIN garment_hire_header ON garment_hire_line.hire_id = garment_hire_header.hire_id 
JOIN garment ON garment_hire_line.garment_id = garment.garment_id 
JOIN catalogue ON garment.catalogue_id = catalogue.catalogue_id 
Group by garment_hire_header.member_id) s CROSS JOIN 
(SELECT COUNT(garment_hire_header.hire_id) as TotalHires 
FROM garment_hire_header 
Group by garment_hire_header.member_id) h 

それは私が働いていることちょっとプッシュしようとしているさらに。 hire_idが、私は別のクエリではなく、何らかの理由で過去に働いている以下を追加しようとしました

別のクエリで発見された場合、私はこの場合にのみ動作していないデータを表示したい:

WHERE garment_hire_line.hire_id IN 
(SELECT hire_id, DATE_ADD(date_out, INTERVAL (days) DAY) AS 'Expected Return', DATEDIFF(return_date, DATE_ADD(date_out, INTERVAL (days) DAY)) as 'Days Late' 
FROM garment_hire_line 
WHERE DATEDIFF(return_date, DATE_ADD(date_out, INTERVAL (days) DAY)) > 0 
ORDER BY hire_id) 

答えて

0

cross joinleft joinに変更してから、を追加してテーブルを一致させることで、これを修正することは可能です。しかし、この状況にはもっと良いアプローチがあります:

SELECT garment_hire_header.member_id, garment_hire_line.hire_id, 
SUM(garment_hire_line.days*catalogue.daily_rate) AS 'Total Spend', 
SQ1.TotalHires, 
SUM(garment_hire_line.days*catalogue.daily_rate)/SQ1.TotalHires AS `Total` 
FROM garment_hire_line 
LEFT JOIN garment_hire_header ON garment_hire_line.hire_id = 
garment_hire_header.hire_id 
LEFT JOIN garment ON garment_hire_line.garment_id = garment.garment_id 
LEFT JOIN catalogue ON garment.catalogue_id = catalogue.catalogue_id 
LEFT JOIN (SELECT garment_hire_header.member_id, 
COUNT(garment_hire_header.hire_id) as TotalHires 
FROM garment_hire_header 
Group by garment_hire_header.member_id) AS SQ1 ON SQ1.member_id = 
garment_hire_header.member_id 
Group by garment_hire_header.member_id; 

私は初期コードを可能な限りそのまま残しています。キーポイントは、計算に同じテーブルを使用しているので、すべてをサブクエリに配置する必要はないということです。 joinsの名前をleft joinsに変更しましたが、クエリの動作方法は変わりませんが、実行している結合の種類を指定する方が適切です。

+0

こんにちはMartyn。ありがとう、それは私が何をしたのかを返します。私は、別のものを試してみると、物事を複雑にしてきたと思う。あなたの返信によって、私は一歩後退して再評価されました。私は、将来少しずつ違う方法でアプローチするかもしれない。乾杯! – Lumsden

関連する問題