2017-04-17 50 views
0

我有6列唯一的表AFFECTED_ITEM從SQL Server中的多個表中選擇數據

我想要一個查詢將爲每個表輸出列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; 

例子:

AFFECTED_ITEM | Table1 | Table2 | Table3 | Table6 | 
-------------------------------------------------- 
Item1   | 53 | 45 | 12 | 0 | 
Item2   | 4 | 13 | 77 | 9 | 
Item3   | 7 | 0 | 24 | 23 | 

等。

+0

,提供6個表格和預期輸出的樣本數據。 – Mansoor

回答

1

使用Common Table Expression從所有表得到所有可能的值的列表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 
) 

然後將其與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 

看本sql fiddle證明。

0

你可以使用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 
+0

我有一個錯誤不明確的列名'AFFECTED_ITEM' – keilash

+0

我的表1,2,3,4,5,6的別名是錯誤的。我剛剛編輯.... – TriV

0

LEFT JOIN是不是你需要真正的reault完整外部由2加入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 
) 

然後重複它未來2表和接下來的兩個,然後完全加入所有的結果。這將是一個長期的查詢,但你肯定不會放棄螞蟻數據。

這個鏈接看看:http://www.dofactory.com/sql/full-outer-join你需要再爲避免空值完全加入需要「聚結」,LEFT JOIN絕對是錯誤的,你會在右邊的表丟失數據。

0

首先插入所有的表1,表2 ...表6的數據臨時table.After使用基於該臨時表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 
+0

@凱拉什,我張貼您的問題的答案。嘗試上面的查詢。 – Mansoor

0

請嘗試以下...

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 

這裏我們將六個查詢返回的數據集中的五個連接到公共值AFFECTED_ITEM上的第六個查詢(在這種情況下,您的操作順序無關緊要)。

然後我們SELECT每行從新形成的數據集中顯示每個計數字段。合併用於顯示0,其中不存在計數AFFECTED_ITEM的值。

如果您有任何問題或意見,請隨時發佈相應評論。