2015-01-02 39 views
1

我有兩個表,例如:兩個表計數兩個seprate列

table1 
--------------------- 
|id | name| isActive| 
|---|-----|---------| 
| 1 | dd | 1 | 
| 1 | cc | 1 | 
| 1 | zz | 1 | 
| 1 | yy | 1 | 
--------------------- 


table2 
--------------------- 
|id | name| isActive| 
|---|----|----------| 
| 1 | ab | 1 | 
| 1 | cd | 1 | 
| 1 | ef | 1 | 
| 1 | gh | 1 | 
--------------------- 

的要求得到兩個表的計數和打印他們兩個單獨的列,並將其打印成BIRT兩個單獨的列報告我已經嘗試過這種

SELECT 
    COUNT(table2.`name`) Table1Count, 
    table1.`isActive` Table1IsActive , 
    COUNT(table2.`name`) Table2Count, 
    table2.`isActive` Table2IsActive 
FROM 
    `table1`, 
    `table2` 

它放出來是在兩個單獨的列,但與交叉連接

Table1Count isActive Table2Count Table2IsActive 
----------- -------- ----------- ---------------- 
    43316   0   3536     1 

我不能使用任何連接,因爲在這兩個表沒有任何關係,而其輸出類似於所需出來放,我想兩個表通過嘗試這種在單獨的列

計數我得到兩個不同的行

SELECT 
    * 
FROM 
    (SELECT 
    COUNT(*) Table1Count, 
    table1.`isActive` Table1IsActive 
    FROM 
    `table1` 
    UNION 
    SELECT 
    COUNT(*) Table2Count, 
    table2.`isActive` Table2IsActive 
    FROM 
    `table2 `) AS a 

其輸出分成兩行顯示,而我的要求是不同的列

Table1Count Table1IsActive 
------------ -------------- 
    442   0 
    98   1 

回答

1

在您的UNION中,爲另一個表中的列添加額外的列。然後使用MAX()

SELECT MAX(Table1Count) AS Table1Count, MAX(Table1IsActive) AS Table1IsActive, 
     MAX(Table2Count) AS Table2Count, MAX(Table2IsActive) AS Table2IsActive 
FROM (SELECT COUNT(*) Table1Count, table1.`isActive` Table1IsActive, 0 Table2Count, 0 Table2IsActive 
     FROM `table1` 
     UNION 
     SELECT 0 Table1Count, 0 Table1IsActive, COUNT(*) Table2Count, table2.`isActive` Table2IsActive 
     FROM `table2`) AS a 
+0

未知列'Table2Count'在'字段列表':( –

+0

你忘了'0 '在第3行的Table2Count之前? – Barmar

+0

您的SQL語法有錯誤;請檢查與您的MySQL服務器版本相對應的手冊,以便在'0 Table1Count', –

1

試試這個:

SELECT (SELECT COUNT(*) FROM `table1`) AS Table1Count, 
     (SELECT COUNT(*) FROM `table2`) AS Table2Count; 
+0

其工作正常,但我需要其他列,以及我的方式,我得到的答案,並感謝您分享這種方法 –

1

UNION將始終在工會使用來自第一選擇列名組合它們。由於這兩個查詢返回單行,你可以用一個簡單的笛卡爾乘積(1×1 = 1)的查詢組合:

SELECT t1.Table1Count, t1.Table1IsActive, t2.Table2Count, t2.Table2IsActive 
FROM 
    (SELECT 
    COUNT(*) Table1Count, 
    table1.isActive Table1IsActive 
    FROM 
    table1 
    GROUP BY table1.isActive 
    ) as t1, 
    (SELECT 
    COUNT(*) Table2Count, 
    table2.isActive Table2IsActive 
    FROM 
    table2 
    GROUP BY table2.isActive  
) as t2; 

編輯從評論

更新 - 我相信什麼你追求的是如下,即計算所有行,也算只是有效行(在一個單一的查詢),然後在兩個表重複此,項目單行結果:

SELECT 
     t1.Table1Count, t1.Table1Active, t2.Table1Count, t2.Table2Active 
FROM 
    (
     SELECT COUNT(t1.id) AS Table1Count, 
       SUM(CASE WHEN t1.IsActive = '1' THEN 1 ELSE 0 END) AS Table1Active 
     FROM Table1 t1 
    ) t1, 
    (
     SELECT COUNT(t2.id) AS Table1Count, 
       SUM(CASE WHEN t2.IsActive = '1' THEN 1 ELSE 0 END) AS Table2Active 
     FROM Table2 t2 
    ) t2; 

這是非常重要的這兩者的派生表格(t1和t2)每個都壓平成一行,否則笛卡爾產品將重複行。

+0

其工作正常,但仍然重複記錄 –

+0

我在考慮你的樣本數據不具有代表性,例如你有兩個isActive = 0和IsActive = 1行數據? – StuartLC

+0

是@stuartLC我確實有這兩個isActive = 0或isActive = 1 –