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

私は、クエリの結果は(表を挿入していない)

新しいクエリに結果同じテーブルにこのようになりたい

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) 

SQLクエリ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

編集あなたの質問をし、サンプルデータと望ましい結果を提供します。

一つの方法は、union allと集計使用しています。前述のように、これは1行の列が互いに関係していないため、SQLで行うのは分かりやすいようには見えません。 –

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557と受け入れられた回答 –

答えて

1

、あなたは日付列は、各行に同じになるようにして、ちょうど数を取得したいです。

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。 。 。これで、2番目のサブクエリでタイプミスが修正されました。 –

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