简体   繁体   English

从SQL Server中的多个表中选择数据

[英]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_ITEMCount(*)

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 JOINCount 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM