2016-05-24 4 views
-2

3つのテーブルの複数の列の値を連結し、1つの列に表示します。日付insqlserverによる出力結果の反復

date    amt1 
1-1-2016 10:44:00 111 
1-1-2016 10:44:02 222 repeat date 
3-4-2016 11:44:00 111 

表2:

date    amt2 
1-1-2016 10:44:02 101 
2-2-2016 10:44:02 333 
2-3-2016 10:44:02 444 

表3:私の問題は、日が続いamt2一つのテーブルの繰り返しである場合、amt3も同じ日に

TABLE1を繰り返すことであるDateTime.Nowが日付フィールドがあります

date    amt3 
2-2-2016 10:44:04 001 
2-3-2016 10:44:02 002 
3-3-2016 10:44:02 003 

クエリ

SELECT 
COALESCE(t1.date, t2.date, t3.date) 
, t1.amt1 
, t2.amt2 
, t3.amt3 
FROM tb_amount t1 
FULL JOIN tb_cashamt t2 ON t1.date =t2.date 
FULL JOIN tb_grandtotal t3 ON t2.date = t3.date 

出力:

date    amt1 amt2 amt3 
1-1-2016 10:44:00 111 null NULL 
1-1-2016 10:44:02 111 101 null data repeat on amt1(111) 
2-2-2016 10:44:02 NULL 333 null 
2-2-2016 10:44:04 NULL 333 001  data repeat on amt2(111) 
TOTAL    --- --- ----- 

所望の出力:

date  amt1   amt2   amt3 
1-1-2016 111   101   NULL 
2-2-2016 NULL   333   001 
TOTAL  total(amt1) total(amt1) total(amt1) 

私はdatecolumnのsmalldatetime型のデータ型に問題があります。私はそれぞれの日付とAMT1、amt2に結果が欲しい、amt3はこの日に総データを表示

+3

をそれは本当に質問ではありません... –

+0

あなたは 'JOIN'キーワードを探しています。 – David

答えて

1

使用FULL JOIN

SELECT 
    COALESCE(t1.date, t2.date, t3.date) 
    , t1.amt1 
    , t2.amt2 
    , t3.amt3 
FROM Table1 t1 
FULL JOIN Table2 t2 ON t1.date =t2.date 
FULL JOIN Table3 t3 ON t2.date = t3.date 
+0

あなたのお返事ありがとうございますが、私は合計のamt1、合計amt2、合計pltの新しい行の合計amt3を得る方法 – rashmi

+0

@rashmiあなたはすべての行と同じクエリ内の合計行が欲しいですか?それとも総ラインだけ?両方ともあなたが組合をしなければならない場合 – SQLChao

1

あなたはUsing Outer Joins上で説明したようにもFULL OUTER JOINとして知られているFULL JOINを、使用する必要があります:

結合の結果に不一致の行を含めることによって不一致情報を保持するには、完全外部結合を使用します。 SQL Serverは、完全な外部結合演算子FULL OUTER JOINを提供します。これは、他のテーブルに一致する値があるかどうかにかかわらず、両方のテーブルのすべての行を含みます。

; 
WITH Table1  AS 
(  SELECT  [Date], Amt1 
     FROM ( VALUES 
        ('2016-01-01', 111), 
        ('2016-02-02', 222), 
        ('2016-04-03', 111) 
       ) AS Table1(Date, Amt1) 
),  Table2  AS 
(  SELECT  [Date], Amt2 
     FROM ( VALUES 
        ('2016-01-01', 101), 
        ('2016-02-02', 333), 
        ('2016-03-02', 444), 
        ('2016-03-03', 456), 
        ('2016-04-01', 101), 
        ('2016-04-03', 111) 
       ) AS Table2(Date, Amt2) 
),  Table3  AS 
(  SELECT  [Date], Amt3 
     FROM ( VALUES 
        ('2016-02-02', 001), 
        ('2016-03-02', 002), 
        ('2016-03-03', 003), 
        ('2016-04-01', 555), 
        ('2016-04-02', 666), 
        ('2016-04-03', 777) 
       ) AS Table3(Date, Amt3) 
) 
SELECT  ISNULL(Table1.Date, ISNULL(Table2.Date, Table3.Date)) Date, 
      Table1.Amt1, Table2.Amt2, Table3.Amt3 
FROM  Table1 
FULL JOIN Table2 ON Table1.Date = Table2.Date 
FULL JOIN Table3 ON Table2.Date = Table3.Date 
ORDER BY ISNULL(Table1.Date, ISNULL(Table2.Date, Table3.Date)) 
+0

お返事いただきありがとうございますが、私は合計amt1、合計amt2、合計amt3は、合計PLZの新しい行に私を教えて – rashmi

0

日付ごとに1つだけの行が必要な場合は、+の合計によってグループに最初にあなたは合計ロールアップを使用することができます+入社前に日付レベルでのテーブルの各必要があります。

select coalesce(T1.Date,T2.Date,T3.Date), sum(T1.Amt1),Sum(T2.Amt2),Sum(T3.Amt3) 
from 
(
    select convert(date, date) as Date, sum(Amt1) as Amt1 
    from Table1 
    group by convert(date, date) 
) T1 
full outer join (
    select convert(date, date) as Date, sum(Amt2) as Amt2 
    from Table2 
    group by convert(date, date) 
) T2 on T1.Date = T2.Date 
full outer join (
    select convert(date, date) as Date, sum(Amt3) as Amt3 
    from Table3 
    group by convert(date, date) 
) T3 on isnull(T1.Date,T2.Date) = T3.Date 
group by rollup(coalesce(T1.Date,T2.Date,T3.Date))