[英]Select data from multiple tables in SQL Server
I have 6 unique tables with same column AFFECTED_ITEM
. 我有6个具有相同列
AFFECTED_ITEM
唯一表。
I want a query will which output column AFFECTED_ITEM
and Count(*)
for each table. 我想查询将为每个表的哪个输出列
AFFECTED_ITEM
和Count(*)
。
SELECT
AFFECTED_ITEM, Count(*)
FROM
dbo.Table1
WHERE
AFFECTED_ITEM IS NOT NULL
GROUP BY
AFFECTED_ITEM;
SELECT
AFFECTED_ITEM, Count(*)
FROM
dbo.Table2
WHERE
AFFECTED_ITEM IS NOT NULL
GROUP BY
AFFECTED_ITEM;
...
SELECT
AFFECTED_ITEM, Count(*)
FROM
dbo.Table6
WHERE
AFFECTED_ITEM IS NOT NULL
GROUP BY
AFFECTED_ITEM;
Example: 例:
AFFECTED_ITEM | Table1 | Table2 | Table3 | Table6 |
--------------------------------------------------
Item1 | 53 | 45 | 12 | 0 |
Item2 | 4 | 13 | 77 | 9 |
Item3 | 7 | 0 | 24 | 23 |
etc.. 等等..
Use a Common Table Expression to get a list of all possible values for AFFECTED_ITEM from all tables: 使用公用表表达式从所有表中获取AFFECTED_ITEM的所有可能值的列表:
WITH AffectedItems (AFFECTED_ITEM) AS (
SELECT DISTINCT AFFECTED_ITEM FROM table1
UNION
SELECT DISTINCT AFFECTED_ITEM FROM table2
UNION
SELECT DISTINCT AFFECTED_ITEM FROM table3
UNION
SELECT DISTINCT AFFECTED_ITEM FROM table4
UNION
SELECT DISTINCT AFFECTED_ITEM FROM table5
UNION
SELECT DISTINCT AFFECTED_ITEM FROM table6
)
Then combine that with the Group By clause combine with LEFT Joins to get the counts: 然后将其与Group By子句与LEFT Joins结合以获取计数:
WITH AffectedItems (AFFECTED_ITEM) AS (
SELECT DISTINCT AFFECTED_ITEM FROM table1
UNION
SELECT DISTINCT AFFECTED_ITEM FROM table2
UNION
SELECT DISTINCT AFFECTED_ITEM FROM table3
UNION
SELECT DISTINCT AFFECTED_ITEM FROM table4
UNION
SELECT DISTINCT AFFECTED_ITEM FROM table5
UNION
SELECT DISTINCT AFFECTED_ITEM FROM table6
)
SELECT ai.AFFECTED_ITEM, count(t1.name) as table1, count(t2.name) as table2,
count(t3.name) as table3,count(t4.name) as table4, count(t5.name) as table5,
count(t6.name) as table6
FROM AffectedItems ai
LEFT JOIN dbo.table1 t1 on t1.AFFECTED_ITEM = ai.AFFECTED_ITEM
LEFT JOIN dbo.table2 t2 on t2.AFFECTED_ITEM = ai.AFFECTED_ITEM
LEFT JOIN dbo.table3 t3 on t3.AFFECTED_ITEM = ai.AFFECTED_ITEM
LEFT JOIN dbo.table1 t4 on t4.AFFECTED_ITEM = ai.AFFECTED_ITEM
LEFT JOIN dbo.table2 t5 on t5.AFFECTED_ITEM = ai.AFFECTED_ITEM
LEFT JOIN dbo.table3 t6 on t6.AFFECTED_ITEM = ai.AFFECTED_ITEM
GROUP BY ai.AFFECTED_ITEM
See it demonstrated in this sql fiddle . 看到它在此sql提琴中演示。
You could use LEFT JOIN
and Count Distinct
in key columns 您可以在关键列中使用
LEFT JOIN
和Count Distinct
SELECT t.AFFECTED_ITEM,
Count(DISTINCT t1.KeyId ) AS Table1,
Count(DISTINCT t2.KeyId ) AS Table2,
Count(DISTINCT t3.KeyId ) AS Table3,
Count(DISTINCT t4.KeyId ) AS Table4,
Count(DISTINCT t5.KeyId ) AS Table5,
Count(DISTINCT t6.KeyId ) AS Table6
FROM yourTable t
LEFT JOIN Table1 t1 ON t.AFFECTED_ITEM = t1.AFFECTED_ITEM
LEFT JOIN Table2 t2 ON t.AFFECTED_ITEM = t2.AFFECTED_ITEM
LEFT JOIN Table3 t3 ON t.AFFECTED_ITEM = t3.AFFECTED_ITEM
LEFT JOIN Table4 t4 ON t.AFFECTED_ITEM = t4.AFFECTED_ITEM
LEFT JOIN Table5 t5 ON t.AFFECTED_ITEM = t5.AFFECTED_ITEM
LEFT JOIN Table6 t6 ON t.AFFECTED_ITEM = t6.AFFECTED_ITEM
GROUP BY t.AFFECTED_ITEM
Left join is not true reault you need full outer join 2 by 2 like this : 左联接不是真正的reault,您需要像这样通过2进行完全外部联接:
with CteT1AndT2 as (
SELECT coalesce(t1.AFFECTED_ITEM,t2.AFFECTED_ITEM) as AFFECTED_ITEM,
Count(DISTINCT t1.KeyId ) AS CntTable1,
Count(DISTINCT t2.KeyId ) AS CntTable2,
FROM Table1 t1
FULL OUTER JOIN Table2 ON t1.AFFECTED_ITEM = t2.AFFECTED_ITEM
GROUP BY t1.AFFECTED_ITEM,t2.AFFECTED_ITEM
)
Then repeat it for next 2 tables and next two ones then full join all the results with each other. 然后对接下来的2个表和接下来的两个表重复此操作,然后将所有结果彼此完全合并。 It will be a long query but you won't loose ant data for sure.
这将是一个漫长的查询,但是您不会确定会丢失蚂蚁数据。
Take a look at this link : http://www.dofactory.com/sql/full-outer-join you need full join then for avoiding null values need 'coalesce', LEFT JOIN is absolutely wrong and you will loose data in right table. 看一下此链接: http : //www.dofactory.com/sql/full-outer-join您需要完全连接,然后为了避免空值需要'coalesce',LEFT JOIN绝对错误,您将丢失正确的数据表。
First insert all your table1 , table2 ... table6 data to temp table.After that use PIVOT concept based on that temp table 首先将所有table1,table2 ... table6数据插入到临时表中,然后使用基于该临时表的PIVOT概念
CREATE TABLE #table(AFFECTED_ITEM VARCHAR(100),_Count INT,_table
VARCHAR(100))
INSERT INTO #table(AFFECTED_ITEM ,_Count , _table )
SELECT AFFECTED_ITEM, Count(*),'Table1'
FROM dbo.Table1
WHERE AFFECTED_ITEM IS NOT NULL
GROUP BY AFFECTED_ITEM
INSERT INTO #table(AFFECTED_ITEM ,_Count , _table )
SELECT AFFECTED_ITEM, Count(*),'Table2'
FROM dbo.Table2
WHERE AFFECTED_ITEM IS NOT NULL
GROUP BY AFFECTED_ITEM
....... Upto table6
SELECT AFFECTED_ITEM , ISNULL([Table1],0) [Table1] , ISNULL([Table2],0)
[Table2] , ISNULL([Table3],0) [Table3] , ISNULL([Table4],0) [Table4] ,
ISNULL([Table5],0) [Table5],ISNULL([Table6],0) [Table6]
FROM
(
SELECT AFFECTED_ITEM , _Count , _table
FROM #table
) A
PIVOT
(
SUM(_Count) FOR _table IN ([Table1],[Table2],[Table3],[Table4],[Table5],
[Table6])
) pvt
Please try the following... 请尝试以下...
SELECT itemCountFinder1.AFFECTED_ITEM AS AFFECTED_ITEM,
COALESCE( itemCount1, 0 ) AS Table1,
COALESCE( itemCount2, 0 ) AS Table2,
COALESCE( itemCount3, 0 ) AS Table3,
COALESCE( itemCount4, 0 ) AS Table4,
COALESCE( itemCount5, 0 ) AS Table5,
COALESCE( itemCount6, 0 ) AS Table6
FROM ( SELECT AFFECTED_ITEM,
Count( * ) AS itemCount1
FROM dbo.Table1
WHERE AFFECTED_ITEM IS NOT NULL
GROUP BY AFFECTED_ITEM ) AS itemCountFinder1
LEFT JOIN ( SELECT AFFECTED_ITEM,
Count( * ) AS AS itemCount2
FROM dbo.Table2
WHERE AFFECTED_ITEM IS NOT NULL
GROUP BY AFFECTED_ITEM ) AS itemCountFinder2 ON itemCountFinder1.AFFECTED_ITEM = itemCountFinder2.AFFECTED_ITEM
LEFT JOIN ( SELECT AFFECTED_ITEM,
Count( * ) AS itemCount3
FROM dbo.Table3
WHERE AFFECTED_ITEM IS NOT NULL
GROUP BY AFFECTED_ITEM ) AS itemCountFinder3 ON itemCountFinder1.AFFECTED_ITEM = itemCountFinder3.AFFECTED_ITEM
LEFT JOIN ( SELECT AFFECTED_ITEM,
Count( * ) AS itemCount4
FROM dbo.Table4
WHERE AFFECTED_ITEM IS NOT NULL
GROUP BY AFFECTED_ITEM ) AS itemCountFinder4 ON itemCountFinder1.AFFECTED_ITEM = itemCountFinder4.AFFECTED_ITEM
LEFT JOIN ( SELECT AFFECTED_ITEM,
Count( * ) AS itemCount5
FROM dbo.Table5
WHERE AFFECTED_ITEM IS NOT NULL
GROUP BY AFFECTED_ITEM ) AS itemCountFinder5 ON itemCountFinder1.AFFECTED_ITEM = itemCountFinder5.AFFECTED_ITEM
LEFT JOIN ( SELECT AFFECTED_ITEM,
Count( * ) AS itemCount6
FROM dbo.Table6
WHERE AFFECTED_ITEM IS NOT NULL
GROUP BY AFFECTED_ITEM ) AS itemCountFinder6 ON itemCountFinder1.AFFECTED_ITEM = itemCountFinder6.AFFECTED_ITEM
Here we left join five of the datasets returned by your six queries to the sixth query on the common value AFFECTED_ITEM
(the order in which you do so does not matter in this case). 在这里,我们将六个查询返回的数据集中的五个数据集留给了公共值
AFFECTED_ITEM
上的第六个查询(在这种情况下,执行的顺序无关紧要)。
We then SELECT
each row from the newly formed dataset and display each of the count fields. 然后,我们从新形成的数据集中
SELECT
每一行,并显示每个计数字段。 Coalesce is used to display a 0
where no count exists for that value of AFFECTED_ITEM
. 合并用于显示
0
,其中不存在该AFFECTED_ITEM
值的计数。
If you have any questions or comments, then please feel free to post a Comment accordingly. 如果您有任何问题或意见,请随时发表评论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.