2017-07-31 97 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