【问题标题】:Comma Separated list of rows of a column with group by on other columns逗号分隔的列的行列表,在其他列上具有分组依据
【发布时间】:2013-01-24 06:05:59
【问题描述】:

下面是我的表结构:-

T1

C1  C2  C3
---------- 
X   P   A
X   P   B
Y   Q   C
Y   Q   D

期望的输出:-

C1   C2   C3
------------ 
X    P    A,B
Y    Q    C,D

注意:-我知道我可以对 For XML('') 做同样的事情,在 C1 和 C2 上使用 group by,但我的主要问题是这里的表 T1 必须是物理表对象(永久或临时或表 var 或 CTE)在 DB 中。但在我的情况下,它是一个派生表,当我使用下面的查询时,它说的是无效对象。 在我的情况下,用 temp# 表或固定表甚至 CTE 或表变量替换派生表并不好,因为这需要很大的努力。

SELECT 
b.C1, b.C2, Stuff((',' + a.C3 from t1 a where a.c1 = b.c1 for XML PATH('')),1,1,'') FROM
T1 b group by b.c1,b.c2

我没有 T1 作为固定表。请仅将其视为派生表。

我需要现有派生表的解决方案。 请帮忙。

下面是带有派生表的查询:- 请将此仅视为演示查询。并不像下面给出的那么简单,为了得到派生表做了很多计算,使用了4级派生表。

SELECT C1, C2, Stuff((',' + a.C3 from A B where a.c1 = b.c1 for XML PATH('')),1,1,'')
FROM
(
SELECT C1, C2, C3  FROM T1 WHERE C1 IS NOT NULL--and a lot of calculation also
)A

请注意,T1 不只是低于一级,在我的情况下,T1 实际物理表是派生表的 4 级下降。

【问题讨论】:

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2


【解决方案1】:

如果您可以将查询发布到生成派生表,我们可以帮助您解决,但目前尝试用派生查询替换 table1

;WITH Table1
AS
(
    SELECT C1, C2, C3  FROM T1 WHERE C1 IS NOT NULL--and a lot of calculation also
)
SELECT
     C1,C2,
     STUFF(
         (SELECT ',' + C3
          FROM Table1
          WHERE C1 = a.C1 AND C2 = a.C2
          FOR XML PATH (''))
          , 1, 1, '')  AS NamesList
FROM Table1 AS a
GROUP BY C1,C2

【讨论】:

  • 亲爱的@JW。我已经提到我没有任何固定表,这里的 Table1 是一个派生表,因此在子查询中无法访问。请通过考虑这个限制来建议我。
  • @GKRanjan 为什么您认为派生表不可访问?尝试发布生成派生表的查询。 CTE 可以提供帮助。
  • 嗨@JW,请重新检查原始问题。
  • 嗨@HamletHakobyan 感谢您的回答,但为什么我不能对派生表做同样的事情。从优化的角度来看 - CTE 命中基表的次数与它在 Select 语句中引用的次数一样多。因此,在上述情况下,它将被引用两次。还有什么方法可以与 COALESCE 功能相同吗?请给我建议。非常感谢。
猜你喜欢
  • 2012-01-24
  • 2018-07-13
  • 2020-05-08
  • 2018-08-07
  • 1970-01-01
  • 2018-02-08
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多