0

次のスクリプトを実行していますが、連結されたフィールドが間違った値を返しています。

select customer_no, card_no, count(*) as no_trans,
stuff((select ',' + CAST(trans_id as varchar(20))
     from transactions a (nolock)
     where a.customer_no = b.customer_no and a.card_no = b.card_no
     for xml path('')),1,1,'') AS trans_ids
from transactions b (nolock)
where date>= '01 apr 2013'
and date < '30 apr 2013'
and trans_id in (select trans_id
          from product_items (nolock)
          where product_item in ('298029'))
group by customer_no, card_no

私が期待しているのはノーです。その中にproduct_itemがあり、trans_idのリストを連結フィールドとして返すtrans (count(*))。

例えば。

customer_No            card_no        no_trans           trans_ids
1234                   12345          2                  1, 2

しかし、私が得ているのは;

customer_No            card_no        no_trans           trans_ids
1234                   12345          2                  1, 2, 3, 5, 6

誰かが私が間違ったことを教えてもらえますか? 前もって感謝します。

サンプルデータ

取引表

Customer_No         Card_No        Trans_ID
1234                12345          1
1234                12345          2

商品アイテム表

Trans_ID        Product_item
1               298029
2               298029
4

1 に答える 1

1

あなたの問題は、クエリproduct_itemsの一部でもフィルタリングする必要があることだと思います。for xmlCTE を使用して必要な行をクエリしtransactions、CTE を使用して連結することで、これを行うことができますTrans_ID

これは、私があなたの問題であると私が信じていることを示すいくつかのサンプルデータと、あなたが望むことをするはずのCTEを使用したクエリを含むSQL Fiddleです。

SQL フィドル

MS SQL Server 2008 スキーマのセットアップ:

create table transactions
(
  Customer_No int,
  Card_No int,
  Trans_ID int
)

create table product_items
(
  Trans_ID int,
  Product_item int
)

insert into transactions values
(1234, 12345, 1),
(1234, 12345, 2),
(1234, 12345, 3),
(1234, 12345, 4),
(1234, 12345, 5)

insert into product_items values
(1, 298029),
(2, 298029),
(3, 298020),
(4, 298020),
(5, 298020)

クエリ 1 :

-- Your query
select customer_no, card_no, count(*) as no_trans,
stuff((select ',' + CAST(trans_id as varchar(20))
     from transactions a (nolock)
     where a.customer_no = b.customer_no and a.card_no = b.card_no
     for xml path('')),1,1,'') AS trans_ids
from transactions b (nolock)
where trans_id in (select trans_id
                   from product_items (nolock)
                   where product_item in ('298029'))
group by customer_no, card_no

結果

| CUSTOMER_NO | CARD_NO | NO_TRANS | TRANS_IDS |
------------------------------------------------
|        1234 |   12345 |        2 | 1,2,3,4,5 |

クエリ 2 :

-- Rewritten to use a CTE
with C as
(
  select T.Customer_No, 
         T.Card_No,
         T.Trans_ID
  from transactions as T
  where T.Trans_ID in (select P.Trans_ID
                       from product_items as P
                       where P.Product_Item in ('298029'))
)
select C1.Customer_No,
       C1.Card_No,
       count(*) as No_Trans,
       stuff((select ',' + cast(C2.Trans_ID as varchar(20))
              from C as C2 
              where C1.Card_No = C2.Card_No and
                    C1.Customer_No = C2.Customer_No
              for xml path('')), 1, 1, '') as Trans_IDs
from C as C1
group by C1.Customer_No, 
         C1.Card_No

結果

| CUSTOMER_NO | CARD_NO | NO_TRANS | TRANS_IDS |
------------------------------------------------
|        1234 |   12345 |        2 |       1,2 |
于 2013-05-13T05:28:07.250 に答える