2014-01-15 1 views
1

Я пытаюсь подсчитать все предметы для каждой марки и объединить фирменное наименование + количество элементов.Конкатенация nvarchar и int при сохранении отличного результата

У меня есть этот запрос в SQL Server 2008 R2:

SELECT DISTINCT 
    Brands.BrandName + ' ' + COUNT(Items.ITEMNO) as ITEMSNO, 
    Brands.BrandId 
FROM Items, Brand_Products, Brands 
WHERE  
    Items.ITEMNO=Brand_Products.ItemNo 
    AND Brands.BrandId=Brand_Products.BrandId 
    AND Items.SubcategoryID='SCat-020' 
GROUP BY 
    Brands.BrandId, 
    Brands.BrandName, 
    Items.ITEMNO 

Я пытаюсь объединить 2 поля, но у меня есть 2 проблемы:

  1. если я сделаю это, как показано в моем Например, у меня есть проблема с nvarchar и int.
  2. , если я использую преобразование У меня есть проблема с (Distinct)

Любой помощью? :)

ответ

1

Это будет работать, кулак, который вы подсчитаете на основе BrandId в CTE, и присоедините его к таблице Brand.

WITH ItemCount 
     AS (SELECT BrandId 
       ,COUNT(Items.ITEMNO) AS item_Count 
      FROM Items 
       ,Brand_Products 
       ,Brands 
      WHERE Items.ITEMNO = Brand_Products.ItemNo 
       AND Brands.BrandId = Brand_Products.BrandId 
       AND Items.SubcategoryID = 'SCat-020' 
      GROUP BY Brands.BrandId) 
SELECT b.BrandName + ' ' + CONVERT(VARCHAR(5), Item_Count) 
    FROM Brands AS b 
    JOIN ItemCount AS I 
     ON b.BrandId = i.BrandId 
+0

благодарим вас за помощь, все работает отлично! – Sam

+0

Вопрос только в том, можно ли выбрать поле BrandId и конкатенированную строку? – Sam

+1

Да, просто измените 'select b.brandid, b.BrandName + '' + CONVERT (VARCHAR (5), Item_Count)' –

0

Преобразовать в varchar перед тем конкатенации

'Whatever ' + CONVERT(VARCHAR(8), COUNT(Items.ITEMNO)) + ' Whatever ' 
+0

НИКОГДА не используйте 'varchar' без параметра длины. Это опасно, потому что по умолчанию разные в разных контекстах. –

+0

спасибо за ваш быстрый ответ, он отлично работает, но явный всегда дает мне 1 вместо 5 для каждой марки. Я не могу удалить отдельный, потому что он будет повторять название бренда для каждого элемента! – Sam

1

Получить поле, которое вы ищете в два раза, один раз в каскадной поле ответа, и один раз сам по себе. Это должно решить вашу проблему с DISTINCT.

Смежные вопросы