2

ここで他の多く の投稿を確認し、Coalesce関数にかなり精通しましたが、この特定のタスクを実行する方法を理解できませんでした。

つまり、CommissionsテーブルとCategoriesテーブルがあります。ここで要点を作成したので、いくつかのサンプルデータで正確なデータ構造を確認できます。基本的に、Commissionテーブルには、SalesRepID、LocationID、CategoryID、SurgeonID、およびCommissionPercent列があります。

Coalesce関数を使用して、SalesRepID、LocationID、およびSurgeonIDを渡すことで次のようなものを取得できました。

.05 (Shirts), .05 (Shoes), .05 (Dresses), .10 (Hats), .15 (Pants)

しかし、私はそれを次のように見せようとしています:

.05 (Shirts, Shoes, Dresses), .10 (Hats), .15 (Pants)

STUFFで何度か試しましたが、探している結果が得られませんでした。

これがMsSQL2008R2でも可能かどうかを尋ねる理由はどれですか?もしそうなら、私が探している結果を得るための助けをいただければ幸いです。

時間とエネルギーをありがとうございました、

アンドリュー

4

2 に答える 2

3

あらすじありがとうございます!歯を抜いてスキーマとデータを取得するよりもはるかに優れています。:-) これを Gist クエリにプラグインすると、目的の結果が表示されるはずです (まあ、非常に近い - 以下を参照)。

DECLARE @SalesRepID int = 2, 
        @SurgeonID  int = 1, 
        @LocationID int = 1;

;WITH x AS 
(
  SELECT CommissionPercent, Categories = STUFF((SELECT N', ' 
      + tCat.Category FROM #tCategories AS tCat 
      INNER JOIN #tCommissions AS tCom 
      ON tCat.CategoryID = tCom.CategoryID
      WHERE tCom.CommissionPercent = com.CommissionPercent
      FOR XML PATH, 
      TYPE).value(N'./text()[1]', N'nvarchar(max)'), 1, 2, N'') 
 FROM #tCommissions AS com
 WHERE SalesRepID = @SalesRepID
   AND SurgeonID  = @SurgeonID
   AND LocationID = @LocationID
),
y AS
(
  SELECT s = RTRIM(CommissionPercent) + N' (' + Categories + N')' 
  FROM x GROUP BY CommissionPercent, Categories
)
SELECT Result = STUFF((SELECT N', ' + s FROM y 
  FOR XML PATH, 
  TYPE).value(N'./text()[1]', N'nvarchar(max)'), 1, 2, N'');

結果は要求したものとは少し異なりますが、CommissionPercent をプルするときに文字列の書式設定を適用することで修正できます。

Result
--------------------------------------------------------
0.05 (Shirts, Shoes, Dresses), 0.10 (Hats), 0.15 (Pants)
于 2012-05-01T22:54:18.067 に答える
0

以前に同様の問題に遭遇しました-これを(カーソルを使用せずに)解決できる唯一の方法は、CLR集計関数を作成することです。C# (および VB) の例を次に示します: http://technet.microsoft.com/en-us/library/ms131056(v=SQL.90).aspx

必要なこと、つまり連結を行うだけだと思います。

例と CLR を組み合わせて、目的を達成する - SQL は次のようになります。

SELECT
  c.CommissionPercent
  , dbo.MyAgg(cat.Category)
FROM #tCommissions AS c
JOIN #tCategories AS cat ON c.CategoryID = cat.CategoryID
group by c.CommissionPercent
于 2012-05-01T22:49:05.543 に答える