2016-05-10 12 views
-1

は、私がして、グループをコーディングしようとしましたが、動作していないは、これは非常に一般的な要件です

RegDate     signupdate   channel ID  product 
09/05/2016 23:52:34 09/05/2016 23:55:06 Mobile  1   apple 
09/05/2016 23:52:32 09/05/2016 23:52:45 Mobile  2   mango 
09/05/2016 23:52:16      Mobile  3   mango 
09/05/2016 23:52:49      Mobile  4   banana 
09/05/2016 23:52:50      Mobile  5   banana 
09/05/2016 23:52:50 09/05/2016 15:52:45 Mobile  5   Kiwi 

出力

Regdate  min  No.of Regs No.of Signups channel Product 
09/05/2016 23:52  1   1    mobile apple    
09/05/2016 23:52  2   1    mobile mango    
09/05/2016 23:52  2       mobile banana 
09/05/2016 23:52  1       mobile Kiwi 

私の現在のクエリ:

select SUBSTR(TO_CHAR(regdate, 'HH24:MI:SS'),1,5),count(distinct ID), 
     channel, product 
from glance_REG_act_Prod_samp 
group by SUBSTR(TO_CHAR(regdate, 'HH24:MI:SS'),1,5), source, reg_product 
+2

どのようなrdbmsを使用していますか? –

+0

oracleを使用していますが、ここではregdateとsignupdateの両方を含める方法がわかりません select count(別名ID)、SUBSTR(TO_CHAR(regdate、 'HH24:MI:SS')、1,5)、 ソース、reg_product from glance_REG_act_Prod_samp グループby SUBSTR(TO_CHAR(regedate、 'HH24:MI:SS')、1,5)、ソース、reg_product – nkalis

+0

出力の最初の列はregdateですが、クエリの先頭にカウントがあります。 – jarlh

答えて

0

group byに日付が必要ですが、秒は必要ないと思います。これはあなたが望むことをしますか?

select TO_CHAR(regdate, 'YYYY-MM-DD HH24:MI'), source, reg_product, 
     count(distinct ID) 
from glance_REG_act_Prod_samp 
group by TO_CHAR(regdate, 'YYYY-MM-DD HH24:MI'), source, reg_product; 

注:IDの重複が本当に存在しない限り、あなたはCOUNT(*)を使用する必要があります。

+0

ありがとうございましたGordon、しかし私は両方の列を出力として、no.of regsとno.ofの出力に記載されているサインアップが必要です。上記の質問にはno.orまたはregsがあります – nkalis

0

私は、これはあなたが後にしているものだと思う:私はid列が一意であり、実際には、あなたの最後の行にid = 5はタイプミスだったことを仮定しました

with sample_data as (select to_date('09/05/2016 23:52:34', 'dd/mm/yyyy hh24:mi:ss') regdate, to_date('09/05/2016 23:55:06', 'dd/mm/yyyy hh24:mi:ss') signupdate, 'Mobile' channel, 1 id, 'apple' product from dual union all 
        select to_date('09/05/2016 23:52:32', 'dd/mm/yyyy hh24:mi:ss') regdate, to_date('09/05/2016 23:52:45', 'dd/mm/yyyy hh24:mi:ss') signupdate, 'Mobile' channel, 2 id, 'mango' product from dual union all 
        select to_date('09/05/2016 23:52:16', 'dd/mm/yyyy hh24:mi:ss') regdate, null signupdate, 'Mobile' channel, 3 id, 'mango' product from dual union all 
        select to_date('09/05/2016 23:52:49', 'dd/mm/yyyy hh24:mi:ss') regdate, null signupdate, 'Mobile' channel, 4 id, 'banana' product from dual union all 
        select to_date('09/05/2016 23:52:50', 'dd/mm/yyyy hh24:mi:ss') regdate, null signupdate, 'Mobile' channel, 5 id, 'banana' product from dual union all 
        select to_date('09/05/2016 23:52:50', 'dd/mm/yyyy hh24:mi:ss') regdate, to_date('09/05/2016 15:52:45', 'dd/mm/yyyy hh24:mi:ss') signupdate, 'Mobile' channel, 6 id, 'kiwi' product from dual) 
select to_char(regdate, 'dd/mm/yyyy') regdate, 
     to_char(regdate, 'hh24:mi') min, 
     count(*) num_of_regs, 
     count(case when signupdate >= regdate then 1 end) num_signups, 
     channel, 
     product 
from  sample_data 
group by to_char(regdate, 'dd/mm/yyyy'), 
     to_char(regdate, 'hh24:mi'), 
     channel, 
     product 
order by product; 

REGDATE MIN NUM_OF_REGS NUM_SIGNUPS CHANNEL PRODUCT 
---------- ----- ----------- ----------- ------- ------- 
09/05/2016 23:52   1   1 Mobile apple 
09/05/2016 23:52   2   0 Mobile banana 
09/05/2016 23:52   1   0 Mobile kiwi 
09/05/2016 23:52   2   1 Mobile mango 

注意。

キウイ製品の出力にサインアップカウントがない理由は、登録日が登録日より前だったためです。あなたはその背後にある論理を説明しなかったので、それがあなたの期待される出力のタイプミスであるかどうかわかりません。しかし、あなたが必要とする結果を出力するために私のクエリを修正できるはずです(例えば、case when signupdate is not null then 1 end?)。

また、0の代わりに空白を表示する場合は、単純なCASE/DECODEを出力して0の代わりにnullに変更します。あなたの選択。

完全に脇に、あなたはしています:SUBSTR(TO_CHAR(regdate, 'HH24:MI:SS'),1,5) ...なぜですか?あなたは日付から文字列を作成してから短縮します。なぜあなたはあなたが望む形式で日付から文字列を作成しませんか?例えば。 to_char(regdate, 'hh24:mi')

+0

こんにちはBoniest、完璧な答え、分析の場のおかげで、それは働いた、あなたの考えは優れています – nkalis

関連する問題