2012-01-10 2 views
0

Я пытаюсь использовать следующий запрос в хранимой процедуре, чтобы получить все из таблицы Promotion и count (*) из таблицы Merchant_Views. Но я получаю сообщение об ошибке «Неправильный синтаксис рядом с ключевым словом» из «.». Это в SQl Server 2005. Я смущаюсь, как это можно решить. Что я делаю не так. Спасибо за помощь!Ошибка SL для использования count (*) в запросе соединения

SELECT *, (count(*) from Merchant_Views) FROM dbo.Promotion 
INNER JOIN dbo.Merchant_Location ON dbo.Promotion.LocationID = dbo.Merchant_Location.LocationID 
INNER JOIN dbo.Merchant_Views MV ON MV.LocationID = dbo.Promotion.LocationID 
and dbo.Merchant_Views.ClickDate >= dbo.Promotion.startDate 
and dbo.Merchant_Views.ClickDate <= dbo.Promotion.expireDate 
and dbo.Merchant_Views.Status <> 'printed' 
WHERE [email protected] AND [email protected] 

спасибо !!

+0

Где COUNT (*) часть кода, которую вы упомянули? –

+0

My bad !! Посмотрите на запрос сейчас. Спасибо! – Ram

+1

Что он должен делать? Все ответы до сих пор выглядят неправильно. Предположительно, вы пытаетесь подсчитать «Merchant_Views», относящиеся к определенному «Promotion», а не просто считать все из них? Каковы ваши структуры таблиц? –

ответ

1

Вы просто не хватает ОТБОРНОЕ, прежде чем COUNT (*)

SELECT *, ViewCnt 
FROM dbo.Promotion p 
    INNER JOIN dbo.Merchant_Location ml ON p.LocationID = ml.LocationID 
    INNER JOIN dbo.Merchant_Views mv ON mv.LocationID = p.LocationID 
    INNER JOIN 
    (SELECT p.ID, COUNT(*) AS ViewCnt 
     FROM dbo.Promotion p 
      INNER JOIN dbo.Merchant_Views mv ON mv.LocationID = p.LocationID 
     GROUP BY p.Id) t ON t.ID = p.ID 
WHERE p.MerchantID= @MerchantID AND [email protected] 
    AND MV.ClickDate >= p.startDate 
    AND MV.ClickDate <= p.expireDate 
    AND MV.Status <> 'printed' 
+0

Большое спасибо Bassam. – Ram

0

Вы должны ОТБОРНОЕ на внутреннем запросе.

SELECT *, (SELECT count(*) FROM Merchant_Views) FROM dbo.Promotion 
... 
0

Я думаю, это потому, что ofthis оговорки в выберите

(count(*) from Merchant_Views) 
0

Вы пропускаете ВЫБРАТЬ в ваш внутренний SELECT:

SELECT *, (SELECT count(*) from Merchant_Views) FROM dbo.Promotion 
INNER JOIN dbo.Merchant_Location ON dbo.Promotion.LocationID = dbo.Merchant_Location.LocationID 
INNER JOIN dbo.Merchant_Views MV ON MV.LocationID = dbo.Promotion.LocationID 
and dbo.Merchant_Views.ClickDate >= dbo.Promotion.startDate 
and dbo.Merchant_Views.ClickDate <= dbo.Promotion.expireDate 
and dbo.Merchant_Views.Status <> 'printed' 
WHERE [email protected] AND [email protected] 
+0

Идентификатор из нескольких частей «dbo.Merchant_Views.ClickDate» не может быть связан. Это новая ошибка, которую я получаю. Нужно ли добавлять группу? Спасибо! – Ram

+0

Возможно, вы получаете ошибку thsi, потому что yo используют Alias ​​dbo.Merchant_Views MV –

+0

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

1
SELECT *, (SELECT count(*) from Merchant_Views) FROM dbo.Promotion P 
INNER JOIN dbo.Merchant_Location ML ON P.LocationID = ML.LocationID 
INNER JOIN dbo.Merchant_Views MV ON MV.LocationID = P.LocationID 
and MV.ClickDate >= P.startDate 
and MV.ClickDate <= P.expireDate 
and MV.Status <> 'printed' 
WHERE [email protected] AND [email protected] 

Редактировать

Вы ищете что-то вроде этого?

SELECT count(P.PromotionID) AS COUNT --, MV.column1, mv.column2 --and so on.. 
FROM dbo.Promotion P 
INNER JOIN dbo.Merchant_Location ML ON P.LocationID = ML.LocationID 
INNER JOIN dbo.Merchant_Views MV ON MV.LocationID = P.LocationID 
and MV.ClickDate >= P.startDate 
and MV.ClickDate <= P.expireDate 
and MV.Status <> 'printed' 
WHERE [email protected] AND [email protected] 
--group by -- MV.column1, mv.column2 --and so on.. 
+0

@Ram вы пытаетесь получить количество просмотров каждого продавца, связанное с рекламными акциями? Если это так, вам нужно указать имена столбцов, а не «*», и выбор будет другим, и вам нужно будет использовать некоторые групповые байты, если вам нужно подсчет –

+0

Мне нужно получить количество строк для каждого объявления PromotionID. Я сожалею о недоразумении и благодарю за ваше время, исправляющее меня ... – Ram

+0

Полагаю, да, мне также нужно получить все из таблицы Promotion вместе с Count (of PromotionID) в таблице Merchant_Views. – Ram

1

Да Вы бы ДЕЙСТВИТЕЛЬНО хотели бы использовать группу с помощью агрегации (count()) здесь.

SELECT p.field,p.field2.p.field3,ml.f1,ml.f2,ml.f3,mv.f1,mv.f2,mv.f3, count(mv.*) FROM dbo.Promotion P 
INNER JOIN dbo.Merchant_Location ML ON P.LocationID = ML.LocationID 
INNER JOIN dbo.Merchant_Views MV ON MV.LocationID = P.LocationID 
and MV.ClickDate >= P.startDate 
and MV.ClickDate <= P.expireDate 
and MV.Status <> 'printed' 
WHERE [email protected] AND [email protected] 
group by p.field,p.field2.p.field3,ml.f1,ml.f2,ml.f3,mv.f1,mv.f2,mv.f3 
+0

Утомляйтесь от производительности там --- группой, и все соединения хотел бы установить правильные индексы. SELECT * - это плохая вещь, особенно для большого стола. Я просто предупреждаю вас. Вы должны тщательно проверить свои планы выполнения. –

+0

Да, я должен действительно внимательно это увидеть. Благодарю вас за консультацию г-н Беннер. – Ram