0

次の結果を返すカテゴリごとに各顧客が費やした金額を返すピボット クエリがあります。

transaction_id  1       2       3       4       5       6       7
10-52927        NULL    NULL    NULL    NULL    NULL    NULL    NULL
10-52928        NULL    NULL    NULL    NULL    NULL    NULL    NULL
10-52929        8       NULL    NULL    NULL    NULL    149     NULL
10-52930        NULL    NULL    NULL    NULL    NULL    NULL    NULL
10-52931        NULL    NULL    NULL    NULL    NULL    NULL    NULL
10-52932        NULL    NULL    12      NULL    NULL    NULL    NULL
10-52934        NULL    NULL    NULL    NULL    NULL    NULL    NULL
10-52935        NULL    NULL    NULL    NULL    NULL    33      NULL
10-52936        NULL    NULL    NULL    NULL    NULL    NULL    NULL

ピボットは、製品レベルからカテゴリへの売上を集計する複数の行に基づいています。つまり、各 transaction_id レコードは、 sum() をピボット パラメーターとして使用して、通常 20 以上の行から集計されます。

私が達成したいのは、顧客がカテゴリ1、2、3、4、5から何かを購入したかどうかを示す0-1形式で結果を取得することです...〜400 + 店舗。

結果を保存および更新するための追加のテーブルを作成せずにこのタスクを実行する方法について何か提案はありますか?

前もって感謝します。

編集:

表示される出力を生成するクエリは次のとおりです。

select transaction_id, [1], [2], [3], // up to ~400 numerical categories
from (SELECT  [transaction_id]
             ,[category]
             ,sum([SUM]) as SUM_2
      FROM [XXX].[dbo].[receipts]
      left join // join of recept table with category table
      where // store type related parametrs
      group by transaction_id, category) p 
PIVOT (sum([sum_2]) for [category] in
       ([1], [2], [3], [4], ... ) // shortened list of categories in order to improve code readability
      ) as pvt 
ORDER BY pvt.transaction_id

カテゴリー

4

3 に答える 3

0

これは実際にはかなり楽しい質問です。これは、常に値が存在するように、グループ ID と拡散列 ID の外積を取得する 2 番目のソリューションです。この方法に関連してパフォーマンスが低下することは想像に難くありません。

@Mark Ba​​nnister の SIGN の使用を使用して、0/1 列に 1 を生成しました。

;WITH P AS
(
   SELECT 
      IDS.transaction_id, IDS.category, CAST(ISNULL(SIGN(C.Sum), 0) AS INT) [hassum]
   FROM 
      (SELECT DISTINCT
      A.transaction_id, B.category
      FROM Reciepts [A] CROSS JOIN Categories [B]) AS IDS
      LEFT JOIN Transaction AS T ON T.transaction_id = IDS.transaction_ID
      LEFT JOIN Category AS C ON -- some unspecified join ...
          AND C.Category = IDS.Category
)
SELECT transaction_id, [1], [2], [3]
FROM P
PIVOT (MIN(hassum) FOR category IN ([1], [2], [3]) ) AS [hassum]
于 2013-06-24T13:16:01.177 に答える
0

cte (FROM 部分) を変更せずにこれを行うことができます。

SELECT と FROM の間に追加

INTO #MyTempTable

より安全なのは、これを事前に作成し、既に存在するかどうかを確認し、既存の SELECT から INSERT することです。

次に、次のことができます。

SELECT transaction_id, CASE WHEN [1] IS NULL THEN 0 ELSE 1 END [1], 
-- repeat each case
FROM #MyTempTable

CTE を変更できる場合は、group by と集計 [SUM_v2] を削除し、値を常に 1 にします。PIVOT で SUM を MIN に変更します。

次に、テーブルの列をより簡単な方法でチェックできます。ISNULL([1], 0) [1]

于 2013-06-24T12:37:17.840 に答える