2016-07-27 5 views
2

数は常に1ですが、私が得る必要があるのは、各カテゴリの数またはニュースの数です。カテゴリスポーツの2つのニュースを持っており、カテゴリ・テクノロジーは4つのニュースを持っているよう:SQL Server各カテゴリのニュースの数を取得する方法

select 
    News.NewsId, News.NewsTitle, 
    COUNT(News.NewsId) as Total 
from 
    News 
group by 
    News.NewsId, News.NewsTitle 
inner join 
    NewsCategory on News.NewsId = NewsCategory.NewsId 
where 
    NewsCategory.CategoryId in (Select CategoryId 
           from Category 
           where CategoryName = 'travel' 
            or CategoryName = 'Technology' 
            or CategoryName = 'Sport') 
group by 
    n.NewsId, n.NewsTitle 
+0

その後NewsCategory.CategoryId' –

+1

'によってグループがあなたのクエリの構文が正しくありません。 –

+0

本当に有効なSQL Server構文ですか?いくつかのサンプルテーブルデータと期待される結果を追加します。 – jarlh

答えて

1

NewsCategory.CategoryIによって、グループのいずれかまたはすべてのニュース情報にOVER -clause必要がある場合:

select News.NewsId, 
     News.NewsTitle, 
     CategoryName, 
     CountInGroup = COUNT(*) OVER (PARTITION BY NewsCategory.CategoryId) 
from News 
inner join NewsCategory 
    on News.NewsId = NewsCategory.NewsId 
where NewsCategory.CategoryId in (Select CategoryId 
            from Category 
            where CategoryName = 'travel' 
            or CategoryName = 'Technology' 
            or CategoryName = 'Sport') 

注意ごGROUP BY n.NewsId, n.NewsTitleが冗長ですとにかく、すべてのレコードを返します。だから毎回カウント= 1になるのです。これはそれを行う必要があります

SELECT NewsCategory.CategoryId, Category.CategoryName, COUNT(News.NewsId) as Total 
FROM News 
INNER JOIN NewsCategory on News.NewsId = NewsCategory.NewsId 
INNER JOIN Category on Category.CategoryId = NewsCategory.CategoryId 
        AND UPPER(Category.CategoryName) IN ('TRAVEL','TECHNOLOGY','SPORT') 
GROUP BY 
NewsCategory.CategoryId, Category.CategoryName 
+0

ありがとうございました:)あなたのクエリは機能しています。しかし、私はこの1つを実行するようにしようとしたが、それは選択 を働いていない News.NewsId、News.NewsTitle、News.NewsId = NewsCategory.NewsId どこに NewsCategoryに参加ニュース、内側からの総 として COUNT(News.NewsId) NewsCategory.CategoryIdでNewsCategory.CategoryId – Lucy

0

私は思う:

select 
    C.CategoryName, 
    count(N.NewsId) as Total 
from News N 
    inner join NewsCategory NC 
    on N.NewsId = NC.NewsId 
    inner join Category C 
    on NC.CategoryId = C.CategoryId 
where 
    upper(C.CategoryName) in ('TRAVEL', 'TECHNOLOGY', 'SPORT') 
group by 
    C.CategoryName 
2

のカテゴリーと番号を取得するには

+0

で グループ(カテゴリ 区分名=「旅」 または区分名=「テクノロジー」 または区分名=「スポーツ」から、区分 を選択します)しかし、OPが 'ニュースを望んでいるようです。 NewsId、News.NewsTitle' too –

+0

@TimSchmelter、まったく... COUNT(*)OVER(PARTITION BY NewsCategory.CategoryId)の説明をしてください... – Lucy

+0

@Lucyの前に、データベースを使い慣れておらず、使用されたことがありません:[オーバー - ]のドキュメントを見てくださいhttps://msdn.microsoft.com/en-us/library/ms189461.aspx)節を参照してください。 [このstackoverflowの質問](http://stackoverflow.com/questions/6218902/the-sql-over-clause-when-and-why-is-it-useful)また、それを理解するのに役立つかもしれません。任意の集計(またはランキング)関数で使用することができます。 COUNTだけでなく、 'PARTITION BY'は集約したい(この場合はカウントする)「グループ」を指定します。 –

関連する問題