2017-02-07 2 views
0

У меня есть 4 таблицы. Эти таблицы являются результатом подсчета количества записей в другой таблице на основе категории. Вот запрос, используемый для создания этих таблиц:Добавление столбцов из других таблиц SQL

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

Как я уже сказал, из этих таблиц создано четыре таблицы, созданные из разных баз данных. Итак, как я мог написать запрос, который оказался в категории как столбец1, но затем следующие четыре столбца - это результаты подсчета из 4 других баз данных?

EDIT

Incase ничего из этого не было ясно ...

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 с, чтобы сделать это.

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

yes..если у вас есть несколько категорий, перекрестное объединение создаст много строк, которые не нужны. '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 

Я не уверен в выполнении этого запроса, но это вариант, чтобы иметь.