2016-12-05 160 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