【问题标题】:T-SQL How to GROUP BY two fields and concatenate anotherT-SQL如何分组两个字段并连接另一个
【发布时间】:2016-11-10 06:38:30
【问题描述】:

我正在尝试对 2 个字段进行分组并返回第三个字段,该字段是前 2 个共有的另一个字段的值与给定 ProductID 的串联。这是我的数据:

ProductID   Currency   Price   Territory
1           USD        6.99    US
1           EUR        4.99    GR
1           EUR        4.99    HU
1           EUR        4.99    LT
2           USD        7.99    US
2           EUR        5.99    GR
2           EUR        5.99    HU

我希望结果返回如下:

ProductID   Currency   Price   Territories
1           USD        6.99    US
1           EUR        6.99    GR, HU, LT

我可以提取 Currenty 和 Price 列,但不能连接它们共有的 Territories:

SELECT Currency, Price
FROM TerritoryPricing
WHERE ProductID = 1
GROUP BY Currency, Price

如何连接地区?

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

你可以使用 Concat:

SELECT ProductID, Currency, Price, CONCAT(Territory)
GROUP BY territory
FROM employee_tbl;

或者创建一个类似这样的 colace 函数

CREATE FUNCTION [dbo].[terr]
(
    @territoryID int
)
RETURNS varchar(max)
AS
BEGIN
    declare @output varchar(max)
    select @output = COALESCE(@output + ', ', '') + territory
    from TerritoryPricing
    where territoryid = @territoryID

    return @output
END

GO

SELECT UserID, [dbo].terr(territoryID)
FROM TerritoryPricing
GROUP BY territory

GO

【讨论】:

    【解决方案2】:

    测试这段代码

    DECLARE @S VARCHAR(8000)
    SELECT 
        Currency, 
        Price , 
        Territories = (Select @S = @S  + Territory FROM TerritoryPricing as T2 WHERE T1.Currency = T2.Currency AND T1.Price = T2.Price) ,
        Empty = (select @S ='') 
    FROM TerritoryPricing as T1
    WHERE ProductID = 1
    GROUP BY Currency, Price
    

    【讨论】:

      【解决方案3】:

      您可以使用 SQL 的 XML 处理来生成具有 SQL 2000 及更高版本的连接列表:

      create table #TerritoryPricing ( ProductID int, Currency varchar(3), Price decimal(10,2), Territory varchar(2))
      insert into #TerritoryPricing values (1,'USD',6.99,'US')
      insert into #TerritoryPricing values (1,'EUR',4.99,'GR')
      insert into #TerritoryPricing values (1,'EUR',4.99,'HU')
      insert into #TerritoryPricing values (1,'EUR',4.99,'LT')
      insert into #TerritoryPricing values (2,'USD',7.99,'US')
      insert into #TerritoryPricing values (2,'EUR',5.99,'GR')
      insert into #TerritoryPricing values (2,'EUR',5.99,'HU')
      
      SELECT Currency, Price,
          SUBSTRING(
              (SELECT ( ',' + ltrim(rtrim(Territory)))  
              FROM #TerritoryPricing t2
              WHERE t1.Currency = t2.Currency  
                  and t1.Price = t2.Price
                  and ProductID = 1
              ORDER BY t2.Territory
              FOR XML PATH('')
              ), 2, 8000) Territories
      FROM #TerritoryPricing t1
      WHERE ProductID = 1
      GROUP BY Currency, Price
      

      【讨论】:

      • 这太好了,谢谢。我唯一需要添加的是子查询 WHERE 子句中的“WHERE ProductID = 1”。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多