2015-01-26 106 views
9

我正在嘗試編寫一個查詢,查找每次在特定日期範圍內發生在我的表中的同一個人。然後它將這個人分組並且將他們的花費總計在特定範圍內。如果他們的消費習慣大於X金額,則在指定的日期範圍內爲此人返回每一行。不僅僅是分組總量。這是我到目前爲止:MySQL - 組和總數,但返回每個組中的所有行

SELECT member_id, 
SUM(amount) AS total 
FROM `sold_items` 
GROUP BY member_id 
HAVING total > 50 

這是檢索正確的總和返回成員花費超過50美元,但不是每一行。只是每個成員的總數和他們的總數。我目前正在查詢整個表格,我沒有添加日期範圍。

+0

不可能。當你分組時,該組的所有成員行都摺疊成一個代表性的行。如果你想要原始成員行,那麼你不能使用'group by'。 – 2015-01-26 20:23:32

+0

同意。這是您希望在查詢上具有應用程序層的位置,以提供報告所需的小計和細分。 – PaulProgrammer 2015-01-26 20:25:26

+1

您可以'與這個子查詢加入原始表來返回所有相關的行。 – Barmar 2015-01-26 20:33:14

回答

14

JOIN這個子查詢與原表:

SELECT si1.* 
FROM sold_items AS si1 
JOIN (SELECT member_id 
     FROM sold_items 
     GROUP BY member_id 
     HAVING SUM(amount) > 50) AS si2 
ON si1.member_id = si2.member_id 

一般的規則是由同一列(S)的子查詢組,它的選擇,然後你加入那與原始查詢我們在同一列。

+0

這似乎解決了我的問題!謝謝!我從來不知道我可以使用JOIN編寫嵌套的select語句。太棒了。 – 2015-01-26 20:49:19

+0

它不起作用,它不會爲我返回所有摘要:http://pastebin.com/DhvrmNsq查詢應該返回重複的結果(相同的設備和相同的時間),但它會丟失超過2個實例的重複項。 – singe3 2016-06-03 15:55:48

+1

您的子查詢不正確。它只是從每個組中選擇一個ID,而不是所有的ID。您需要選擇要分組的同一列,然後在聯接中使用這些列。 – Barmar 2016-06-03 16:00:49

0

有幾種語法可以得到您要查看的結果,下面是使用內部聯接來確保返回的所有行在由組返回的列表中具有member_id並且總計爲每個某成員有:

SELECT si.*, gb.total from sold_items as si, (SELECT member_id as mid, 
SUM(amount) AS total 
FROM `sold_items` 
GROUP BY member_id 
HAVING total > 50) as gb where gb.mid=si.member_id; 
+0

請不要在答案中使用隱式連接。我們嘗試提升ANSI連接。 – Barmar 2015-01-26 20:35:59

+0

我的道歉,有道理。 – 2015-01-28 09:32:05

1
SELECT member_id, amount 
FROM sold_items si 
INNER JOIN (SELECT member_id, 
SUM(amount) AS total 
FROM `sold_items` 
GROUP BY member_id 
HAVING total > 50) spenders USING (member_id) 

您已經構建的查詢可以用作臨時表來加入。如果member_id不是表格中的索引,則這將隨着比例變慢。 單詞spenders是一個表別名,您可以使用任何有效的別名代替它。

0

我認爲,這可能幫助:

SELECT 
    member_id, 
    SUM(amount) AS amount_value, 
    'TOTAL' as amount_type 
FROM 
    `sold_items` 
GROUP BY 
    member_id 
HAVING 
    SUM(amount) > 50 

UNION ALL 

SELECT 
    member_id, 
    amount AS amount_value, 
    'DETAILED' as amount_type 
FROM 
    `sold_items` 
    INNER JOIN 
    (
     SELECT 
      A.member_id, 
      SUM(amount) AS total 
     FROM 
      `sold_items` A 
     GROUP BY 
      member_id 
     HAVING 
      total <= 50 
    ) AS A 
    ON `sold_items`.member_id = A.member_id 

上述查詢的結果應該是這樣的:

member_id  amount_value amount_type 
========================================== 
1    55    TOTAL 
2    10    DETAILED 
2    15    DETAILED 
2    10    DETAILED 

所以列amount_type將區分兩個特定成員組