如何构建基于列值唯一计数结果的查询?

时间:2017-09-30 01:59:15

标签: mysql sql

我在下面的查询工作正常但来自同一成员的多个记录在numField1中计算。我如何更改它,以便numField1每个位置每个成员只计算1条记录,但仍然像现在一样对它们进行分组?在表中,该成员位于名为memberId的列中。

SELECT *, COUNT(field1) AS numField1, AVG(price1) FROM tableName GROUP BY field1, position HAVING status = '1' ORDER BY numField1 DESC, updated DESC

编辑:也许这会有所帮助,我想知道有多少记录,每个唯一配对的field1和位置都有计数记录,只有一次匹配同一个memberId。

recordId | memberId | status | updated | field1 | position | price
==================================================================
    1         55        1         1      apple       1       1.00
    2         55        1         2      apple       1        .50
    3         65        1         3      apple       1        .75
    4         75        1         4      apple       2       2.00
    5         85        1         5      apple       2       3.00
    6         95        1         6      apple       2       4.00

对于位置为1的苹果,预期输出将为2,因为只有两个唯一的memberId包含apple,位置为1,而位置为2的apple为3,因为三个唯一成员ID包含位置为2的苹果。原始查询计数因为它多次计算具有相同memberId,field1和position的记录,所以每个都有3个。下面的相关预期结果,希望这会有所帮助。

field1 | position | numField1
==============================
apple        1       2
apple        2       3

2 个答案:

答案 0 :(得分:2)

您希望每个field1 + position有一个结果行,因此按他们分组。对于每个此类组合,您希望计算不同的memberID,因此请计算不同的memberID

select field1, position, count(distinct memberid)
from tablename
group by field1, position
order by field1, position;

答案 1 :(得分:0)

你可以试试' DISTINCT' ?

SELECT *
,COUNT(DISTINCT field1) AS numField1
,AVG(price1)
FROM tableName
GROUP BY field1
    ,position
HAVING STATUS = '1'
ORDER BY numField1 DESC
    ,updated DESC