4

これが私の問題の簡単な例です。レポートを作成するストアドプロシージャがあります。

DECLARE @Report TABLE
(Product VARCHAR(10),
Purchases MONEY default (0) 
)
DECLARE @Range TABLE
(minP MONEY,
maxP MONEY,
Descrip VARCHAR(50)
)

INSERT @Range
VALUES(0,1,'0-1'),
(2,5,'2-5'),
(6,10,'6-10')

INSERT @Report(Product, Purchases)
VALUES('A',1),
('A',5),
('B',10)


SELECT r.Product, r.Purchases, x.Descrip  
FROM @Report r CROSS JOIN @Range x 
WHERE r.purchases BETWEEN x.minp AND x.maxp

結果は次のようになります。

Product Purchases   Descrip
A   1.00    0-1
A   5.00    2-5
B   10.00   6-10

結果を次のようにするにはどうすればよいですか。

Product Purchases   Descrip
A   1.00    0-1
A   5.00    2-5
A   0   6-10
B   0   0-1
B   0   2-5
B   10.00   6-10
4

2 に答える 2

3

これはそれを行う必要があります:

SELECT B.Product, ISNULL(C.Purchases,0) Purchases, A.Descrip
FROM @Range A
CROSS JOIN (SELECT DISTINCT Product
            FROM @Report) B
LEFT JOIN @Report C
    ON B.Product = C.Product 
    AND C.Purchases BETWEEN A.minP AND A.maxP
ORDER BY B.Product, Purchases

これがあなたが試すためのデモです。

于 2013-01-04T19:20:45.690 に答える
3

あなたはこのようなことを試すことができます:

  • 範囲のある製品の個別のリストを相互結合して、すべての組み合わせを取得します。
  • この相互結合リストを元のレポートの生データと左結合して、購入データを入力します。
  • where結合関係は、元の句と同じロジックになります(さらにリンクproduct

サンプルクエリ

SELECT
  r2.Product,
  coalesce(r.Purchases, 0) as Purchases,
  x.Descrip  
FROM 
  (select distinct Product from @Report) r2 CROSS JOIN @Range x
    left join @Report r on r.purchases BETWEEN x.minp AND x.maxp
                        and r.product = r2.product

サンプル出力(DEMO):

| PRODUCT | PURCHASES | DESCRIP |
---------------------------------
|       A |         1 |     0-1 |
|       A |         5 |     2-5 |
|       A |         0 |    6-10 |
|       B |         0 |     0-1 |
|       B |         0 |     2-5 |
|       B |        10 |    6-10 |

実際のデータはこれよりはるかに複雑だと思います。たとえば、1つの範囲内に複数の購入がある場合、どのような結果が期待できるかわかりません。しかし、これで少なくとも始めることができます。

于 2013-01-04T19:21:14.113 に答える