2016-08-15 4 views
0

私はすべてのデータを生成するために、すべてのレポートを作成しようとしています。これまでのことは、すべてのデータを表示していますが、対応する列に最小値を持つ2つの行を生成します。同じ行にあるデータを取得できる方法があることを願っていますか?ユニオンで列を2回クエリする

select account, campaign, sale, date 
from 
(
SELECT CHACCOUNTNO as account, CONTSUPREF as campaign,null as sale, ONDATE as date 
FROM   dbo.MKTDW 
WHERE  (RESULTCODE = 'D01') and CONTACT IN ('Campaign ID') 
group by CHACCOUNTNO, CONTSUPREF, ONDATE 

UNION ALL 

SELECT CHACCOUNTNO as account, null as campaign, CONTSUPREF as sale, ONDATE as date 
FROM   dbo.MKTDW 
WHERE  (RESULTCODE = 'D01') and CONTACT IN ('Order') 
group by CHACCOUNTNO, CONTSUPREF, ONDATE 
)account 
group by account,campaign,sale,date 
order by account 

現在の結果:

account     campaign sale  date      
A2043056003(2IJUMI M NULL  N177618 2014-07-21 00:00:00.000 
A2043056003(2IJUMI M LT08704 NULL  2014-07-21 00:00:00.000 

期待される結果:

A2043056003(2IJUMI M)LT08704 N177618 2014年7月21日00:00:00.000あり

+0

ご期待出力 – TheGameiswar

+0

アカウントLT08704は(キャンペーン)何\t N177618(販売)2014年7月21日00:00:00.000(日)すべて同じ行にあります –

答えて

0

答えが簡単になるように扱われます。水平方向に何かを表示したい場合は、SET演算子の代わりにJOINを使用します。コードは以下の通り、テスト済みで、SSMSで完璧に動作します。 :)

--create table structure 
create table dbo.MKTDW 
( CHACCOUNTNO varchar(100), 
    CONTSUPREF varchar(10), 
    RESULTCODE varchar(10), 
    CONTACT varchar(50), 
    ONDATE datetime) 
go 

--insert sample data 
insert dbo.MKTDW 
select 'A2043056003(2IJUMI M)', 'N177618', 'D01', 'Order', '2014-07-21 00:00:00.000' 
union all 
select 'A2043056003(2IJUMI M)', 'LT08704', 'D01', 'Campaign ID', '2014-07-21 00:00:00.000' 
union all 
select 'B2043056003(2IJUMI M)', 'M000000', 'D01', 'Order', '2014-07-21 00:00:00.000' 
union all 
select 'B2043056003(2IJUMI M)', 'X111111', 'D01', 'Campaign ID', '2014-07-21 00:00:00.000' 


--below is the solution 
select a.CHACCOUNTNO as account, 
     a.CONTSUPREF as campaign, 
     b.CONTSUPREF as sale, 
     a.ondate as date   
from dbo.MKTDW as a 
join dbo.MKTDW as b 
on a.CHACCOUNTNO = b.CHACCOUNTNO 
where a.CONTACT = 'campaign id' 
     and b.CONTACT = 'order' 
     and a.RESULTCODE = 'D01' 
     and b.RESULTCODE = 'D01' 

結果:

enter image description here

+0

これはすばらしいです、Henryありがとう!私が見ることができる唯一の問題は、重複した行(accountno occurrsごとに1つ)を生成することです –

+0

あなたはそれを明確にしてくださいできますか?私はいくつかのdupsを得ることができる任意の可能性を見ていない。ここに書き込むことができるサンプルデータはありますか? –

+0

申し訳ありませんサンプルデータを貼り付けるとちょっと混乱してしまいます –

0

すべてのユニオンとnullを指定する必要はありません。

列によって上記基のいずれかがnullである場合
SELECT CHACCOUNTNO as account, CONTSUPREF as campaign,CONTSUPREF as sale, ONDATE as date 
FROM   dbo.MKTDW 
WHERE  (RESULTCODE = 'D01') and CONTACT IN ('Campaign ID','order') 
group by CHACCOUNTNO, CONTSUPREF, ONDATE 

は、ヌルは別々のグループ

+0

ありがとうございますが、このクエリでは、すべての行で '販売'列がnullになります。 –

+0

@CTHealthcare:編集済みの回答 – TheGameiswar

+0

を参照してください。このクエリは、 'キャンペーン'と '販売' gnフィールドは、別のフィールド(連絡先)が「キャンペーンID」であるテーブルからの値であり、「販売」値は「連絡先」フィールドが「注文」である値です。 明確にするために、この選択は私たちのcrm(ユーザー定義フィールド)にはさまざまな目的のためにさまざまなエントリがあります。 「連絡先」フィールドは、各行がどのタイプのエントリであるかを決定し、「accountno」フィールドは行を関連付ける一意の識別子である。私はそれぞれのアカウントの異なる行を一緒に1つの行に持っていきたいです –

関連する問題