#sql #sql-server
Вопрос:
Я создал инструкцию SQL для отображения LinkId в качестве индекса и подсчета того, сколько раз LinkId появлялся в таблице и назывался «щелчки» и составлял процент. Я хотел добавить URL-адрес ссылки из другой таблицы с тем же идентификатором ссылки в обеих таблицах для отображения, но когда я добавил внутреннее соединение, оно подсчитало каждый идентификатор ссылки 49 раз. Почему я получаю вывод 49 вместо 1 и как я могу решить проблему?
Перед внутренним соединением
Ввод:
SELECT DISTINCT
LinkId [Index],
COUNT(*) OVER (PARTITION BY LinkId) [Clicks],
CONVERT(VARCHAR(10), COUNT(*) OVER (PARTITION BY LinkId) * 100 / COUNT(*) OVER (PARTITION BY 1)) '%' [Percent]
FROM
Track_Click_7
WHERE
CampaignId = 24896;
Выход:
Index | Clicks | Percent
26 | 1 | 50%
37 | 1 | 50%
После добавления внутреннего соединения:
SELECT DISTINCT
Track_Click_7.LinkId [Index],
Campaign.Link,
COUNT(*) OVER (PARTITION BY Track_Click_7.LinkId) [Clicks],
CONVERT(VARCHAR(10), COUNT(*) OVER (PARTITION BY Track_Click_7.LinkId) * 100 / COUNT(*) OVER (PARTITION BY 1)) '%' [Percent]
FROM
Track_Click_7
INNER JOIN
Campaign ON Track_Click_7.CampaignId = Campaign.CampaignId
WHERE
Track_Click_7.CampaignId = 24896;
Выход:
Index | Link | Clicks | Percent
26 | URL.... | 49 | 50%
37 | URL.... | 49 | 50%
Желаемый результат:
Index | Link | Clicks | Percent
26 | URL.... | 1 | 50%
37 | URL.... | 1 | 50%
Комментарии:
1. Попробуйте изменить свое соединение на
exists
2. Чего здесь
JOIN
пытаются достичь? Однако причина, по которой вы получаете «больше строк», заключается в том, что у вас есть отношение «один ко многим»; поэтому вы подсчитываете все строки, созданные изJOIN
. Кроме того, почему вы конвертируете свойCOUNT
в avarchar
? Вам гораздо лучше оставить свое значение в качестве числового типа данных и изменить форматирование на уровне представления.3. Сколько результатов вы получаете, когда делаете: ВЫБЕРИТЕ идентификатор кампании, Ссылку из кампании, где идентификатор кампании = 24896, И каковы типичные значения, которые принимает Ссылка в приведенном выше запросе (в частности: может ли она быть НУЛЕВОЙ)?
4. Я согласен с @Larnu рекомендую и вам попробовать несколько простых запросов в новом окне, чтобы увидеть, сколько строк будет соответствовать
CampaignId
в каждой таблице, а затем выполнитьJOIN
без каких-либо группировки; вы должны увидеть, что есть дублирование (49 строк) в одном из столов, которые, надеюсь, могут быть удалены путем добавления вWHERE
предложении или других подобных добавил конкретики. Просмотрите свои результаты и посмотрите, что меняется строка за строкой — это те столбцы, которые вы должны добавить в свой запрос, чтобы ограничить результаты.5. Почему у вас есть несколько строк для одной
CampaignId
в таблице под названиемcampaign
?