2017-12-11 9 views
0

私が直面している特定の問題を解決しようとしています。謝罪私がそれを間違った方法で表現しなければ、私はStackoverflowの新人です。銀行ごとのユーザーの1回の出現を取得してカウントする

ユーザーのユニークな数、作成されたアカウントの数、アクティブ化されたアカウントの数、まだアクティブ化されていないアカウントの数を取得したレポートがあります。

私はこれを得ることができました(作成されたアカウントの数、アクティブ化されたアカウントの数、まだアクティブ化されていないアカウントの数)。

ここに私のスクリプトスニペットがあります。

SELECT Bank,Users, Added_Accounts FROM (
    select BANK_NAME as Bank, COUNT(DISTINCT USER_ID) as 'Users', 
     COUNT(DISTINCT USER_ID+BANK_NAME+ACCOUNT_NUMBER) as Added_Accounts 
    from MA 
    where MOBILE_PROFILE_CREATION between @datefrom and @dateto 
     and USER_ID IS NOT NULL AND USER_ID !='' and Bank_Name NOT LIKE '%XXX%' 
    group by BANK_NAME 

    UNION ALL 

    select 'Total' as Bank, COUNT(DISTINCT USER_ID+BANK_NAME) as 'Users', 
     COUNT(DISTINCT USER_ID+BANK_NAME+ACCOUNT_NUMBER) as Added_Accounts 
    from MA 
    where MOBILE_PROFILE_CREATION between @datefrom and @dateto 
     and USER_ID IS NOT NULL AND USER_ID !='' and Bank_Name NOT LIKE '%XXX%' 

) as WeekData_UsersByBanks 

これは、銀行ごとのユーザー数を取得しますが、私が達成したいのは、ユーザーの最初の出現のみを取得してカウントすることです。ユーザーが3つの銀行に口座を持っている場合は、最初のオカレンスだけを取得してカウントします。

どのようにこれを達成することができますか?

ありがとうございます。

UPDATE

DDL 
CREATE TABLE [dbo].[MA](
    [USER_ID] [nvarchar](255) NULL, 
    [ACCOUNT_NUMBER] [nvarchar](255) NULL, 
    [BANK_CODE] [nvarchar](255) NULL, 
    [BANK_NAME] [nvarchar](255) NULL, 
    [MOBILEPROFILEACTIVE] [float] NULL, 
    [MOBILE_PROFILE_CREATION] [nvarchar](255) NULL, 
    [USERSTATUS] [nvarchar](255) NULL 
) ON [PRIMARY] 

INSERT INTO MA ([USER_ID],[ACCOUNT_NUMBER],[BANK_CODE],[BANK_NAME],  
[MOBILEPROFILEACTIVE],[MOBILE_PROFILE_CREATION],[USERSTATUS]) VALUES  
('[email protected]','009****220','63','Bank A','1','2017-08-07 00:00','N') 
insert into MA ([USER_ID],[ACCOUNT_NUMBER],[BANK_CODE],[BANK_NAME], 
[MOBILEPROFILEACTIVE],[MOBILE_PROFILE_CREATION],[USERSTATUS]) VALUES 
('[email protected]','005****017','63','Bank A','0','2017-08-07 00:00','N') 
insert into MA ([USER_ID],[ACCOUNT_NUMBER],[BANK_CODE],[BANK_NAME], 
[MOBILEPROFILEACTIVE],[MOBILE_PROFILE_CREATION],[USERSTATUS]) VALUES 
('[email protected]','007****559','63','Bank A','0','2017-08-07 00:00','N') 
insert into MA ([USER_ID],[ACCOUNT_NUMBER],[BANK_CODE],[BANK_NAME], 
[MOBILEPROFILEACTIVE],[MOBILE_PROFILE_CREATION],[USERSTATUS]) VALUES 
('[email protected]','302****187','76','Bank E','1','2017-08-07 00:00','N') 
insert into MA ([USER_ID],[ACCOUNT_NUMBER],[BANK_CODE],[BANK_NAME], 
[MOBILEPROFILEACTIVE],[MOBILE_PROFILE_CREATION],[USERSTATUS]) VALUES 
('[email protected]','207****421','33','Bank F','0','2017-08-07 00:00','N') 
insert into MA ([USER_ID],[ACCOUNT_NUMBER],[BANK_CODE],[BANK_NAME], 
[MOBILEPROFILEACTIVE],[MOBILE_PROFILE_CREATION],[USERSTATUS]) VALUES 
('[email protected]','005****047','63','Bank A','0','2017-09-09 00:00','N') 
insert into MA ([USER_ID],[ACCOUNT_NUMBER],[BANK_CODE],[BANK_NAME], 
[MOBILEPROFILEACTIVE],[MOBILE_PROFILE_CREATION],[USERSTATUS]) VALUES 
('[email protected]','237****275','50','Bank B','0','2017-09-09 00:00','N') 
insert into MA ([USER_ID],[ACCOUNT_NUMBER],[BANK_CODE],[BANK_NAME], 
[MOBILEPROFILEACTIVE],[MOBILE_PROFILE_CREATION],[USERSTATUS]) VALUES 
('[email protected]','208****712','57','Bank G','1','2017-09-09 00:00','N') 
insert into MA ([USER_ID],[ACCOUNT_NUMBER],[BANK_CODE],[BANK_NAME], 
[MOBILEPROFILEACTIVE],[MOBILE_PROFILE_CREATION],[USERSTATUS]) VALUES 
('[email protected]','075****022','214','Bank D','1','2017-08-03 00:00','N') 
insert into MA ([USER_ID],[ACCOUNT_NUMBER],[BANK_CODE],[BANK_NAME], 
[MOBILEPROFILEACTIVE],[MOBILE_PROFILE_CREATION],[USERSTATUS]) VALUES   
('[email protected]','601****999','70','Bank C','1','2017-03-15 00:00','N') 
insert into MA ([USER_ID],[ACCOUNT_NUMBER],[BANK_CODE],[BANK_NAME], 
[MOBILEPROFILEACTIVE],[MOBILE_PROFILE_CREATION],[USERSTATUS]) VALUES 
('[email protected]','204****889','33','Bank F','0','2017-04-21 00:00','N') 

は、ここで私が得た結果のSQL Fiddleです。フィドルで

、ユーザー[email protected]は3つのバンク(バンクA、バンクEおよび銀行F)

ではなく、すべての銀行のカウントに表示されてユーザーにアカウントを持って、私は、ユーザーが表示されることを期待します銀行の最初の発生時に。

これがより明確になることを希望します。

+2

を参照してください?また、期待した結果を含めることができますか? [T-SQL質問を投稿する方法](http://www.sqlservercentral.com/articles/Best+Practices/61537/) – Larnu

+0

合計行を達成しようとすると、GROUP BY CUBE(columns_here)を使用することを検討してください。 組合なしで書かれている。 –

+0

@ jerboy、あなたの出力がどのように見えるかはまだ分かりません。あなたはダミーのサンプル出力を表示できますか? – suresubs

答えて

0

あなたには、いくつかのDDLおよび消耗品のサンプルデータを使用しての投稿をしてください編集でしsqlfiddle http://www.sqlfiddle.com/#!6/6a5d4b/37/1

SELECT BANK 
    , SUM(CASE WHEN RNUM = 1 THEN 1 ELSE 0 END) AS Users 
    , MIN(Added_Accounts) AS Added_ACCOUNTS 
    , MIN(Activated_accounts) as Activated_accounts 
FROM (
    select BANK_NAME as Bank 
     , COUNT(ACCOUNT_NUMBER) OVER(PARTITION BY BANK_NAME) as Added_Accounts 
     , ROW_NUMBER() OVER (PARTITION BY USER_ID ORDER BY BANK_NAME) AS RNUM 
     , SUM(MOBILEPROFILEACTIVE) OVER(PARTITION BY BANK_NAME) as Activated_Accounts 

    from MA 
    where MOBILE_PROFILE_CREATION between @datefrom and @dateto 
    and USER_ID IS NOT NULL AND USER_ID !='' and Bank_Name NOT LIKE '%XXX%' 

) as WeekData_UsersByBanks 
GROUP BY BANK 

UNION ALL 
select 'Total' as Bank 
    , COUNT(DISTINCT USER_ID) AS Users 
    , COUNT(DISTINCT USER_ID+BANK_NAME+ACCOUNT_NUMBER) as Added_Accounts 
    , SUM(MOBILEPROFILEACTIVE) 
from MA 
where MOBILE_PROFILE_CREATION between @datefrom and @dateto 
and USER_ID IS NOT NULL AND USER_ID !='' and Bank_Name NOT LIKE '%XXX%' 
+0

ありがとう@Suresubsにあります。本当に役に立ちました。 – jerboy

0

私は銀行で最初に発生したユーザーをどのように得ることができるかを考え出しました。私は単純に以下のスニペットを使用しました。

select user_id email, min(bank_name) as bank from ma 
group by user_id; 

結果はSQL fiddleです。

関連する問題