2017-02-07 6 views
0

私は4つのテーブルを持っています。これらのテーブルは、カテゴリに基づいて別のテーブルのエントリ数をカウントした結果です。他のSQLテーブルからのカラムの追加

SELECT Category, COUNT(*) AS Number 
FROM DATABASE.dbo.TABLE 
GROUP BY Category; 

私が言ったように、異なるデータベースから作成されたこれらのテーブルは4つあります。ですから、どのようにしてCategory1をColumn1としたクエリーを書くことができましたか?次の4つのカラムは別の4つのデータベースのカウント結果ですか?

EDIT包みなさい

は、そのいずれかが...

SELECT Category, COUNT(*) AS Number1 
FROM DATABASE1.dbo.TABLE 
GROUP BY Category; 

SELECT Category, COUNT(*) AS Number2 
FROM DATABASE2.dbo.TABLE 
GROUP BY Category; 

SELECT Category, COUNT(*) AS Number3 
FROM DATABASE3.dbo.TABLE 
GROUP BY Category; 

SELECT Category, COUNT(*) AS Number4 
FROM DATABASE4.dbo.TABLE 
GROUP BY Category; 

明確ではありませんでした。しかし私が欲しいのはこれです:

| Category | Number1 | Number2 | Number3 | Number4 | 
|----------|---------|---------|---------|---------| 
|   |   |   |   |   | 
|   |   |   |   |   | 

私は

SELECT DATABASE1.dbo.TABLE.Category, DATABASE1.dbo.TABLE.COUNT(*), DATABASE2.dbo.TABLE.COUNT(*), DATABASE3.dbo.TABLE.COUNT(*), DATABASE4.dbo.TABLE.COUNT(*) 
FROM DATABASE1.dbo.TABLE 
JOIN DATABASE2.dbo.TABLE 
ON DATABASE1.dbo.TABLE=DATABASE2.dbo.TABLE 
JOIN DATABASE3.dbo.TABLE 
ON DATABASE2.dbo.TABLE=DATABASE3.dbo.TABLE 
JOIN DATABASE4.dbo.TABLE 
ON DATABASE3.dbo.TABLE=DATABASE4.dbo.TABLE 
を試してみました

しかしそれはうまくいかなかった。

+0

カテゴリのこれらのテーブルに参加しますか? – scsimon

+0

これらのサーバーをあなたのサーバーにリンクしましたか? – McNets

+0

@scsimon、私は結合関数を見ましたが、私はこれらのクエリに参加する必要があるか、 'count(*) 'を使って何かに参加できるかどうかはわかりません。 – Neal

答えて

2

あなたがこれを行うにはinner join Sを使用することができます。

SELECT t1.category,t1.Number1,t2.Number2,t3.Number3,t4.Number4 
FROM (select Category,COUNT(*) AS Number1 from DATABASE1.dbo.TABLE GROUP BY Category) t1 
join (select Category,COUNT(*) AS Number2 from DATABASE2.dbo.TABLE GROUP BY Category) t2 
on t1.category=t2.category 
join (select Category,COUNT(*) AS Number3 from DATABASE3.dbo.TABLE GROUP BY Category) t3 
on t2.category=t3.category 
join (select Category,COUNT(*) AS Number4 from DATABASE4.dbo.TABLE GROUP BY Category) t4 
on t3.category=t4.category 

カテゴリがテーブル間で共通でない場合は、full joinです。

SELECT coalesce(t1.category,t2.category,t3.category,t4.category), 
coalesce(t1.Number1,0), 
coalesce(t2.Number2,0), 
coalesce(t3.Number3,0), 
coalesce(t4.Number4,0) 
FROM (select Category,COUNT(*) AS Number1 from DATABASE1.dbo.TABLE GROUP BY Category) t1 
full join (select Category,COUNT(*) AS Number2 from DATABASE2.dbo.TABLE GROUP BY Category) t2 
on t1.category=t2.category 
full join (select Category,COUNT(*) AS Number3 from DATABASE3.dbo.TABLE GROUP BY Category) t3 
on t2.category=t3.category 
full join (select Category,COUNT(*) AS Number4 from DATABASE4.dbo.TABLE GROUP BY Category) t4 
on t3.category=t4.category 
+0

'cross join'と' join'の間で何が変わりましたか?私は 'クロスジョイント 'でそれを試してみたところ、うまくいっていたようだ。 – Neal

+0

はい...複数のカテゴリがある場合、クロスジョインは必要ではない多くの行を生成します。すべてのテーブルにカテゴリが存在しなければならない場合、 'join'はうまくいくはずです。もしそうでなければ、 'フル・ジョイン 'を使わなければならないかもしれません。 –

2

私はunion allおよび凝集を示唆している:

select category, sum(t1) as t1, sum(t2) as t2, sum(t3) as t3, sum(t4) as t4 
from ((select category, 1 as t1, 0 as t2, 0 as t3, 0 as t4 
     from DATABASE1.dbo.TABLE 
    ) union all 
     (select category, 0 as t1, 1 as t2, 0 as t3, 0 as t4 
     from DATABASE2.dbo.TABLE 
    ) union all 
     (select category, 0 as t1, 0 as t2, 1 as t3, 0 as t4 
     from DATABASE3.dbo.TABLE 
    ) union all 
     (select category, 0 as t1, 0 as t2, 0 as t3, 1 as t4 
     from DATABASE4.dbo.TABLE t 
    ) 
    ) tt 
group by category; 
1

あなたは、カテゴリを取得し、カウントする複数のCommon Table Expression(CTE)を使用することができ、それらの複数のCTEに参加しています。

あなたのクエリは次のようになります。

with cte1 as 
(
select category, count(*) as number1 from DATABASE1.dbo.TABLE group by category 
), 
cte2 as 
(
select category, count(*) as number2 from DATABASE2.dbo.TABLE group by category 
), 
cte3 as 
(
select category, count(*) as number3 from DATABASE3.dbo.TABLE group by category 
), 
cte4 as 
(
select category, count(*) as number4 from DATABASE4.dbo.TABLE group by category 
) 
select c1.category, c1.number1,c2.number2,c3.number3,c4.number4 
from cte1 c1 INNER JOIN cte2 c2 ON c1.category = c2.category 
INNER JOIN cte3 c3 ON c1.category = c3.category 
INNER JOIN cte4 c4 ON c1.category = c4.category 

私はこのクエリのパフォーマンスについてわからないが、それは持っているためのオプションです。

関連する問題