2

我在这里查看了许多 其他帖子,并且对 Coalesce 功能非常熟悉,但我无法弄清楚如何执行此特定任务。

所以,我有一个佣金表和一个类别表。我在这里创建了一个要点,因此您可以通过一些示例数据查看确切的数据结构。基本上,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 尝试了几次,但我从来没有得到我想要的结果。

这让我想问这在 MsSQL 2008 R2 中是否可行?如果是这样,任何帮助获得我正在寻找的结果将不胜感激。

非常感谢您的时间和精力,

安德鲁

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 回答