2016-12-05 135 views
0

我是SQL新手,正試圖從數據庫中提取一些數據。查詢選擇語句的結果

我有兩張桌子,一張叫做'tblorders',另一張'tblorderitems',我想把這個團隊訂購的物品數量加起來。

這是我創建的查詢:

SELECT fldcustomerid, fldname, fldcontactname, fldemail, SUM(fldqtyorder) as QtyOrdered 
FROM tblorders AS A 
INNER JOIN tblorderitems AS B ON A.fldorderid = B.fldorderid 
WHERE fldstockcode LIKE 'TO%' AND fldorderdate BETWEEN '2014-01-01' AND '2016-12-31' 
AND fldemail LIKE '%@%' AND fldqtyorder>=30 
GROUP BY fldname, fldcustomerid, fldcontactname, fldemail 
ORDER BY QtyOrdered DESC 

我希望它從「fldqtyorder」列加起來的項目數,然後篩選結果,這樣只會導致有超過30個項目將顯示。

例如INTIAL表將是:

fldname:  fldqtyorder:  fldcontactname:  fldemail: 
TeamFC   24   Fred Jones   [email protected] 
FootyFC   1   Steve Low   [email protected] 
TeamFC   16   James Wild   [email protected] 
Palm FC   33   Phil Bate   [email protected] 

最終的結果應該是如下:

fldname:  fldtotalqtyorder:  fldcontactname:  fldemail: 
TeamFC    40   Fred Jones   [email protected] 
Palm FC    33   Phil Bate   [email protected] 
+1

使用具有fldqtyorder> -30 – xQbert

+0

只回答了主題行,'選擇(select語句放在這裏)derivedTable一些地方etc' –

回答

1

你想:

SELECT fldcustomerid, fldname, fldcontactname, fldemail, SUM(fldqtyorder) as QtyOrdered 
FROM tblorders AS A 
INNER JOIN tblorderitems AS B ON A.fldorderid = B.fldorderid 
WHERE fldstockcode LIKE 'TO%' AND fldorderdate BETWEEN '2014-01-01' AND '2016-12-31' 
AND fldemail LIKE '%@%' 
GROUP BY fldname 
HAVING QtyOrdered >= 30 
ORDER BY QtyOrdered DESC 

您有不同的fldcontactnames相同的fldname,所以它會隨機選擇一個用於輸出。與fldemail和fldcustomerid一樣。但除此之外,輸出應該是你正在尋找的。

您不能只將額外的字段放入group by子句中,因爲這會將具有這些字段的唯一組合的每個行拆分組。如果您希望只要具有相同的fldname,行就會摺疊成一行,那麼只有fldname可以位於group by子句中。

+0

我不相信會執行,因爲你選擇字段不在group by子句中,也不是聚合。 –

+1

它在Mysql中是允許的,它只是隨意選擇一個值,正如我試圖在上面解釋的那樣。可能不是OP真正需要的東西,但是它確實符合給定的輸出。更合理的查詢應該跳過未正確聚合的字段,即fldcustomerid,fldcontactname和fldemail。但這不是問這個問題的方式。 –

+0

哦,我不知道MySQL是這種情況。謝謝你清理那個。 –

0

這是操作順序的問題。

當時where子句僅在記錄的單個記錄上評估它。通過將總和的評估移動到having子句,引擎將評估聚合並僅返回那些> = 30.

把簡單的刪除> = 30放在一個有(不需要子查詢)

SELECT fldcustomerid 
    , fldname 
    , fldcontactname 
    , fldemail 
    , SUM(fldqtyorder) as QtyOrdered 
FROM tblorders AS A 
INNER JOIN tblorderitems AS B 
    ON A.fldorderid = B.fldorderid 
WHERE fldstockcode LIKE 'TO%' 
    AND fldorderdate BETWEEN '2014-01-01' AND '2016-12-31' 
    AND fldemail LIKE '%@%' 
GROUP BY fldname, fldcustomerid, fldcontactname, fldemail 
HAVING sum(fldqtyorder)>=30 
ORDER BY QtyOrdered DESC