Оператор SQL подсчитывает столбец 49 раз вместо одного раза

#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 в a varchar ? Вам гораздо лучше оставить свое значение в качестве числового типа данных и изменить форматирование на уровне представления.

3. Сколько результатов вы получаете, когда делаете: ВЫБЕРИТЕ идентификатор кампании, Ссылку из кампании, где идентификатор кампании = 24896, И каковы типичные значения, которые принимает Ссылка в приведенном выше запросе (в частности: может ли она быть НУЛЕВОЙ)?

4. Я согласен с @Larnu рекомендую и вам попробовать несколько простых запросов в новом окне, чтобы увидеть, сколько строк будет соответствовать CampaignId в каждой таблице, а затем выполнить JOIN без каких-либо группировки; вы должны увидеть, что есть дублирование (49 строк) в одном из столов, которые, надеюсь, могут быть удалены путем добавления в WHERE предложении или других подобных добавил конкретики. Просмотрите свои результаты и посмотрите, что меняется строка за строкой — это те столбцы, которые вы должны добавить в свой запрос, чтобы ограничить результаты.

5. Почему у вас есть несколько строк для одной CampaignId в таблице под названием campaign ?