запутанное предложение count () в запросе SQL - PullRequest
1 голос
/ 31 января 2011

Мне нужна помощь с запросом (извините, я не слишком хорош в этом!)

У меня есть таблица типа:

productid    userid     DateTracked
```````````````````````````````````
1             1          2010-09-11
2             1          2010-09-11
3             1          2010-09-11
4             1          2010-09-11
1             2
2             2
1             1          2010-09-13
2             1          2010-09-13

, поэтому я хочу посчитатьсколько раз каждый пользователь купил каждый продукт.На самом деле, я хочу выбрать количество пользователей, которые купили с сайта более одного раза.это вовсе не материал-идентификатор продукта, я просто объясняю сценарий как можно лучше.

здесь, идентификатор пользователя 1 связан с pid 1,2,3,4, а затем, в другой день, 1,2.

Я пытался

select count(*) from MyTable group by ProductID

и это дает мне список чисел, которые я не уверен, что они означают, или, если это то, что я хочу, правильный ли запрос?

отредактировано для упрощения : есть даты, ивсе, что я хочу выбрать, это количество раз, идентификатор пользователя повторяется в разные даты.В приведенной выше таблице идентификатор пользователя 1 имеет два значения - одно для даты 11 и одно для 13. И у меня есть x число идентификаторов пользователей.

Думаю, это более точно объясняет мою проблему.извиняюсь.так как мне выбрать количество всех идентификаторов пользователей с разными датами?

большое спасибо

Ответы [ 6 ]

2 голосов
/ 31 января 2011

Код

select count(*) from MyTable group by ProductID

Возвращает только количество идентификаторов отдельных продуктов, не давая информации о том, к какому продукту они относятся.

select ProductID, count(*) as cnt from MyTable group by ProductID

дает вам идентификатор продукта и соответствующий счетчик

Чтобы получить количество продуктов, купленных пользователем

select UserID, count(*) as cnt from MyTable group by UserID

И получить количество разпользователь купил определенный продукт

Select UserID, ProductID, Count(*) as cnt from MyTable group by UserID, ProductID

1 голос
/ 31 января 2011

Функция group by используется вместе с вашей агрегатной функцией Count (*) для выполнения агрегатной функции над набором данных, который вписывается в вашу группу. Вы подсчитываете, сколько раз каждый productId встречается в вашей таблице. Смотри http://www.w3schools.com/sql/sql_groupby.asp

Если вы хотите знать, что означает каждый счет, вы должны включить ProductId

SELECT ProductId, Count(*)
FROM MyTable
GROUP BY ProductId

Если вас интересует только счет определенного размера или продуктов определенного типа, вы можете ограничить его дополнительно с помощью пунктов WHERE и HAVING .

SELECT ProductId, Count(*)
FROM MyTable
WHERE ProductType = 'MyType'
GROUP BY ProductId
HAVING Count(*) > 3

Edit: Для вашего обновленного вопроса о группировке по дате и идентификатору пользователя вы хотите следующее.

SELECT UserId, Date, COUNT(*)
FROM MyTable
GROUP BY UserId, Date

Примечание: Вам потребуется преобразовать столбец Date, если он сохранен как DATETIME, в тип DATE для предложения group by, чтобы получить ожидаемые результаты!

1 голос
/ 31 января 2011

Количество пользовательских покупок

Включите закомментированную строку, чтобы получить только пользователей, которые совершили более 1 покупки.

with Pur as
(
    select UserID, DateTracked
    from Purchase
    group by UserID, DateTracked
)
select UserID, count(DateTracked) as NumberOfPurchases
from Pur
group by UserID
-- having count(DateTracked) > 1

Это также можно упростить:

select UserID, count(distinct DateTracked)
from Purchase
group by UserID;

Я не проверял их планы выполнения, но второй, вероятно, быстрее. Вторая подсчитывает только отдельные даты покупки для каждого пользователя, что является вашей главной целью.

Количество покупок товара

Если пользователь может купить несколько одинаковых продуктов за покупку, то этот запрос вы должны использовать:

select ProductID, count(*)
from Purchase
group by ProductID;

Если вы просто хотите посчитать количество покупок, когда определенный товар был включен в покупку, то этот запрос вы должны использовать:

select ProductID, count(distinct DateTracked)
from Purchase
group by ProductID;
0 голосов
/ 31 января 2011

, если вы просто видите, как каждый пользователь может использовать это: SELECT userid,COUNT(productid) FROM tbl GROUP BY userid Я думаю, что это даст вам: идентификаторы пользователей и сколько предметов они покупают ... ты можешь написать: SELECT userid,COUNT(productid) AS cc FROM tbl GROUP BY userid HAVING cc > 1 тогда вы получите только количество идентификаторов и товаров пользователей, которые купили несколько раз ...

0 голосов
/ 31 января 2011

Вы можете использовать утверждение
SELECT productid, userid, count(*) FROM MyTable GROUP BY productid, userid

0 голосов
/ 31 января 2011

Вы вычисляете количество, сгруппированное по ProductID, но вы не указываете, какое количество принадлежит какому ProductID. Просто включите ProductID в качестве выходного столбца:

select ProductID, count(*) from MyTable group by ProductID

Однако, исходя из вашего вопроса, вы не хотите рассчитывать по продуктам. Если вы хотите посчитать количество разных дат, в которые пользователь купил вещи, сгруппируйте их по идентификатору пользователя и посчитайте разные даты:

select UserID, COUNT(DISTINCT DateTracked) from MyTable group by UserID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...