2012-03-13 17 views
0

表構造:tbl_transactionとtblCustomer間
tblCustomer複数のクエリとサブクエリに参加

Customer_id created     field1   field2  cardno  field14 
------------------------------------------------------------------------------------------------  
1014   2010-05-25 12:51:59.547 Cell Phone  [email protected] 1234567890 Test Card 
1015   2010-08-15 12:51:59.547 Email    [email protected] 2345678891 NULL 

tbl_TransactionDishout

Trnx_id offerNo TerminalID  Created     VirtualCard 
------------------------------------------------------------------- 
1   1014  170924690436418 2010-05-25 12:51:59.547 1234567890 

関係は同じCARDNOを有しています。
は、日付ごとのレコードを以下のように結果を取得することが可能です:

   Enrolled Enrolled as Email Enrolled as Text Deals Redeemed 
<First Date> 7   5     2    6 
<Next Date> 9   3     6    14 

日は、それがゼロのレコードを持っている場合でも、両方のテーブルからでなければなりません。..

Enrolled   - Total No of records that is summation of Enrolled as Email and Enrolled as Text.  
Enrolled as Email - Where field1 = 'Email' from tblCustomer table 
Enrolled as Text - Where field1 = 'cell phone' from tblCustomer table 
Deals Redeemed - Where field14 <> 'Test Card' from tblCustomer table and  
        where DishoutResponsecode = '0000' from tbl_Transaction table 

私の既存のクエリ:

SELECT 
convert(varchar, CAST(ISNULL(t1.created,t2.created) AS DATETIME), 111) created, 
COUNT(CASE WHEN (t1.field1 = 'E-mail' or t1.field1 = 'Cell Phone') and (t1.field14 <> 'Test Card' or t1.field14 is null) THEN 1 END) Enrolled, 
COUNT(CASE WHEN t1.field1 = 'E-mail'   and (t1.field14 <> 'Test Card' and t1.field14 is null) THEN 1 END) Enrolled_as_Email, 
COUNT(CASE WHEN t1.field1 = 'Cell Phone'  and (t1.field14 <> 'Test Card' and t1.field14 is null) THEN 1 END) Enrolled_as_Cell, 
COUNT(CASE WHEN t2.DishoutResponseCode = '0000' and (IsNull(t1.field14, '') <> 'Test Card') THEN 1 END) Deals_Redeemed 
FROM tblCustomer AS t1 
FULL OUTER JOIN 
     tbl_TransactionDishout t2 
ON t1.cardno = t2.VirtualCard and t1.created = t2.created 
GROUP BY 
     convert(varchar, CAST(ISNULL(t1.created,t2.created) AS DATETIME),  111) 
ORDER BY 
     convert(varchar, CAST(ISNULL(t1.created,t2.created) AS DATETIME), 111) DESC   

tblCustomerテーブルの最後の4-5の記録

tbl_TransactionDisoutテーブルのの
created     cardno    field14 
---------------------------------------------------------- 
2012-03-07 10:03:00.034 1234007600101240  
2012-03-05 04:02:00.040 1234007600602122  
2012-03-01 06:25:50.400 1234010400972168  Test Card 
2012-03-01 30:05:30.022 555566669999   Test Card 
2012-03-01 50:50:20.450 666677778888   Test Card  

最終4-5記録

created     VirtualCard   DishoutResponseCode 
----------------------------------------------------------------------- 
2012-03-09 13:18:02.703 1234010400972168 0010 
2012-03-09 13:17:35.307 1234010400972168 0002 
2012-03-09 13:17:14.237 1234010400972168 0007 
2012-03-09 13:16:57.650 1234010400972168 0002 
2012-03-08 21:13:57.137 1234010400475686 0000 
2012-03-08 16:50:38.273 1234010400972168 0002 
2012-03-08 16:50:26.070 1234010400972168 0007 
2012-03-08 16:49:49.793 1234010400972168 0002  

だから私はそこに一つだけのカードが応答コード「0000」ともない「テストカード」を持って、この中にある..しかし、コード= '0000'のカードをすべて取得していて、テストカードを持っているので、フィールド14は異なるテーブルと異なる日付のため比較できません。

+0

これは、あなたが同じ質問を、おそらく三日目です。どうして毎日新しい質問を始めるのですか? – Jaques

+0

私は@Jaquesの回答を得ていないので –

+0

DishoutResponseCodeを指定するので、tbl_TransactionDishoutテーブルのレイアウトは何ですか?しかし、あなたはそれを上部に表示しません。もう1つは、は時間を除いた日付ですか? 1日にグループ化したいのですか? – Jaques

答えて

0

これは私が戻った結果ですメインの質問で指定したデータを使用すると、このクエリが使用されます:

SELECT 
    convert(varchar, CAST(ISNULL(t1.created,t2.created) AS DATETIME), 111) created, 
    COUNT(CASE WHEN (t1.field1 = 'Email' or t1.field1 = 'Cell Phone') and (t1.field14 <> 'Test Card' or t1.field14 is null) THEN 1 END) Enrolled, 
    COUNT(CASE WHEN t1.field1 = 'Email'   and (IsNull(t1.field14, '') <> 'Test Card') THEN 1 END) Enrolled_as_Email, 
    COUNT(CASE WHEN t1.field1 = 'Cell Phone'  and (IsNull(t1.field14, '') <> 'Test Card') THEN 1 END) Enrolled_as_Cell, 
    COUNT(CASE WHEN t2.DishoutResponseCode = '0000' and (IsNull(t1.field14, '') <> 'Test Card') THEN 1 END) Deals_Redeemed 
FROM 
    tblCustomer AS t1 
FULL OUTER JOIN 
    tbl_TransactionDishout t2 
    ON t1.cardno = t2.VirtualCard 
    AND t1.created = t2.created 
GROUP BY 
    convert(varchar, CAST(ISNULL(t1.created,t2.created) AS DATETIME), 111) 
ORDER BY 
    convert(varchar, CAST(ISNULL(t1.created,t2.created) AS DATETIME), 111) DESC 

結果:

created      Enrolled Enrolled_as_Email Enrolled_as_Cell Deals_Redeemed 
------------------------------ ----------- ----------------- ---------------- -------------- 
2012/03/09      0   0     0    0 
2012/03/08      0   0     0    1 
2012/03/07      1   0     1    0 
2012/03/05      1   0     1    0 
2012/03/01      0   0     0    0 
+0

今すぐ.. DishoutResponsecode = '0000'のすべての行を表示しますが、tblcustomerのフィールド14をチェックしていません... これは私が見つけた問題です。フィールド14は、tblCustomerテーブルからの日付もチェックされます。チェックが機能していない.. @ Jaques –

+0

tblcustomerのフィールド14をチェックしていないということを意味していません。コードが正しい場合は?たぶん、再度使用するクエリを投稿する必要があります。作成されたフィールドは、常にtblCusomerとtbl_TransactionDishoutで同じになりますか?私はテストのために私の側でそれを作成しているので、あなたは余分なデータを追加することはできますか? – Jaques

+0

@VishalSuthar私は今作成したテーブルでそのクエリを使用しましたが、期待した結果が得られました。期待される結果をもたらさないデータを私に与えてください。そして、何が間違っているのか分かります。 – Jaques

関連する問題