2017-07-31 95 views
-1

如何使用下面的SQL將3個表組合在一起?SQL查詢組合表

----------- ----------- ----------- 
AdminAccLog StaffAccLog PublicAccLog 
----------- ----------- ----------- 
id   id   id 
name   name   name 
ipaddress  ipaddress  ipaddress 
datetime  datetime  datetime 
task   task   task 
--------------------------------------- 

數據

AdminAccLog 1 ABC 127.0.0.1 30/7/2017 0:00:00AM Logon 
AdminAccLog 2 ABC 127.0.0.1 30/7/2017 1:00:00AM Logon 
AdminAccLog 3 ABC 127.0.0.1 31/7/2017 0:00:00AM Logon 

StaffAccLog 1 ABC 127.0.0.1 31/7/2017 0:00:00AM Logon 
PublicAccLog 1 ABC 127.0.0.1 31/7/2017 0:00:00AM Logon 

SQL查詢

SELECT COUNT(*) AS PublicCount, CONVERT(DATE, datetime) AS PublicDate 
FROM PublicAccLog WHERE task = 'Logon' 
GROUP BY CONVERT(DATE, datetime) 

SELECT COUNT(*) AS StaffCount, CONVERT(DATE, datetime) AS StaffDate 
FROM StaffAccLog WHERE task = 'Logon' 
GROUP BY CONVERT(DATE, datetime) 

SELECT COUNT(*) AS AdminCount, CONVERT(DATE, datetime) AS AdminDate 
FROM AdminAccLog WHERE task = 'Logon' 
GROUP BY CONVERT(DATE, datetime) 

我想要的查詢結果是這樣在同一個表(未插入表)

新的查詢結果be:

----------- ---------- ---------- --------- ---------- --------- 
PublicCount PublicDate StaffCount StaffDate AdminCount AdminDate 
----------- ---------- ---------- --------- ---------- --------- 
1   31/7/2017 1   31/7/2017 2   30/7/2017 0:00:00AM 
              1   31/7/2017 0:00:00AM 

又如:

Current result

​​

+0

編輯你的問題,並提供樣本數據和預期的結果。如前所述,這在SQL中看起來並不是一個明智的做法,因爲單行上的列不相互關聯。 –

+0

請閱讀http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557和接受的答案 –

回答

1

想必,你想要的日期欄是各行上相同的,然後就得到計數。

一種方法是使用union all和聚集:

SELECT dte, SUM(PublicCount) as PublicCount, SUM(StaffCount) as StaffCount, 
     SUM(AdminCount) as AdminCount 
FROM ((SELECT CONVERT(DATE, datetime) AS dte , COUNT(*) AS PublicCount, 
       0 as StaffCount, 0 as AdminCount 
     FROM PublicAccLog 
     WHERE task = 'Logon' 
     GROUP BY CONVERT(DATE, datetime) 
    ) UNION ALL 
     (SELECT CONVERT(DATE, datetime), 0, COUNT(*) AS StaffCount, 0 AS StaffDate 
     FROM StaffAccLog 
     WHERE task = 'Logon' 
     GROUP BY CONVERT(DATE, datetime) 
    ) UNION ALL 
     (SELECT CONVERT(DATE, datetime), 0, 0, COUNT(*) AS AdminCount 
     FROM AdminAccLog 
     WHERE task = 'Logon' 
     GROUP BY CONVERT(DATE, datetime) 
    ) 
    ) t 
GROUP BY dte 
ORDER BY dte; 
+0

使用UNION,INTERSECT或EXCEPT運算符組合的所有查詢在目標列表中必須具有相同數量的表達式。 – Syy

+0

@Syy。 。 。這些 - 現在我修復了第二個子查詢中的錯字。 –

0
Select 
MAX(PublicCount)PublicCount, 
MAX(PublicDate), 
MAX(StaffCount)StaffCount, 
MAX(StaffDate)StaffDate, 
MAX(AdminCount)AdminCount, 
MAX(AdminDate)AdminDate 
    from (
SELECT COUNT(*) AS PublicCount, CONVERT(DATE, datetime) AS PublicDate 
FROM PublicAccLog WHERE task = 'Logon' 
GROUP BY CONVERT(DATE, datetime))T 
, 
(

SELECT COUNT(*) AS StaffCount, CONVERT(DATE, datetime) AS StaffDate 
FROM StaffAccLog WHERE task = 'Logon' 
GROUP BY CONVERT(DATE, datetime))TT 
, 

(
SELECT COUNT(*) AS AdminCount, CONVERT(DATE, datetime) AS AdminDate 
FROM AdminAccLog WHERE task = 'Logon' 
GROUP BY CONVERT(DATE, datetime))TTT