Ключевое слово DISTINCT
применяется ко всей строке, а не к столбцу.
В настоящее время DISTINCT
вообще не требуется, поскольку ваш сценарий уже гарантирует, что ShoppingSession
отличается: путем указания столбца в GROUP BY
и фильтрации по другому столбцу группировки (userid
).
Когда вы добавляете третий столбец к GROUP BY
и это приводит к дублированию ShoppingSession
, это означает, что некоторые значения ShoppingSession
связаны со многими различными значениями добавляемого столбца.
Если вы хотите, чтобы ShoppingSession
оставался отличным после включения этого третьего столбца, вы должны решить, какие значения добавленного столбца следует оставить в выходных данных, а какие следует отбросить. Это называется агрегирование . Вы можете применить функцию MAX()
к этому столбцу или MIN()
или любую другую подходящую агрегатную функцию . Обратите внимание, что в этом случае столбец не должен быть включен в GROUP BY
.
Вот иллюстрация того, о чем я говорю:
SELECT
ShoppingSessionId,
userid,
<b>MAX(YourThirdColumn) AS YourThirdColumn</b>
FROM dbo.tbl_ShoppingCart
GROUP BY
ShoppingSessionId,
userid
HAVING userid = 7
Есть еще одна заметка по вашему запросу. Предложение HAVING
обычно используется для фильтрации по агрегированным столбцам. Если ваш фильтр не включает агрегированные столбцы, лучше использовать предложение WHERE
:
SELECT
ShoppingSessionId,
userid,
MAX(YourThirdColumn) AS YourThirdColumn
FROM dbo.tbl_ShoppingCart
<b>WHERE userid = 7</b>
GROUP BY
ShoppingSessionId,
userid
Хотя оба запроса будут давать идентичные результаты, их эффективность будет разной, поскольку первый запрос должен будет извлечь все строки, сгруппировать / агрегировать их, а затем отбросить все строки, кроме userid = 7
, но второй запрос сначала отбросит строки и только затем группируйте / объединяйте оставшиеся, что гораздо эффективнее.
Вы можете пойти еще дальше и исключить столбец userid
из GROUP BY
и получить его значение с помощью функции агрегирования:
SELECT
ShoppingSessionId,
<b>MAX(userid) AS userid,</b>
MAX(YourThirdColumn) AS YourThirdColumn
FROM dbo.tbl_ShoppingCart
WHERE userid = 7
GROUP BY
ShoppingSessionId
Так как все userid
значения в вашем выводе должны содержать 7
(потому что это в вашем фильтре), вы можете просто выбрать максимальное значение для каждого ShoppingSession
, зная, что оно всегда будет 7
.