从SQL Server中的多个表中获取记录 - 很棘手

时间:2017-06-14 19:32:38

标签: sql-server sql-server-2008

我有2个表(应用程序,事务)。

申请

 ID      ApplicationName TransactionID
 -------------------------------------
 1             A             100
 2             A             101 
 3             B             102
 4             B             103
  • TransactionID是唯一的。
  • 应用程序可以有多个TransactionID。

交易

ID      TransactionID   RequestNumber
---------------------------------------
 1            100           RQ1000
 2            101           RQ1000
 3            102           RQ1001
 4            102           RQ1001
 5            102           RQ1002 
  • 单个TransactionID可以包含多个RequestNumber
  • Multple TransactionID可以拥有相同的RequestNumber

现在我的问题是:我想检索它应该如下所示的数据

ApplicationName  Count(RequestNumber)  RequestNumberList
--------------------------------------------------------
      A                 1                   RQ1000
      B                 2                   RQ1001,RQ1002
  • Count(RequestNumber)应该与该应用程序不同RequestNumber
  • RequestNumberList应该是逗号分隔的RequestNumber

我可以使用以下查询获得第3列所需的结果:

SELECT 
    ApplicationName, COUNT(DISTINCT RequestNumber) AS RequestNumber_Count
FROM 
    Application A
JOIN 
    Transaction T ON A.TransactionID = T.TransactionID
GROUP BY 
    ApplicationName

结果:

ApplicationName  Count(RequestNumber)
-------------------------------------
      A                 1
      B                 2

在第3栏我写的是这样的:

SELECT 
    ApplicationName, 
    COUNT(DISTINCT RequestNumber) AS RequestNumber_Count,
    COALESCE(RequestNumber + ', ', '')
FROM 
    Application A
JOIN 
    Transaction T ON A.TransactionID = T.TransactionID
GROUP BY 
    ApplicationName, RequestNumber

结果:

ApplicationName  Count(RequestNumber)  RequestNumberList
---------------------------------------------------------
      A                 1                   RQ1000,
      B                 1                   RQ1001,
      B                 1                   RQ1002,

我需要更改第二个查询以获得所需的结果

提前致谢。

1 个答案:

答案 0 :(得分:0)

最后通过JOIN,STUFF,GROUP BY和HAVING子句的组合实现。

SELECT A.ApplicationName,COUNT(DISTINCT T.RequestNumber) AS RequestNumber_Count, RequestNumberList = STUFF(( SELECT ',' +B.RequestNumber FROM Application D JOIN Trnsaction B ON D.TransactionID=B.TransactionID GROUP BY D.ApplicationName,B.RequestNumber HAVING D.ApplicationName=A.ApplicationName FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') FROM Application A JOIN Trnsaction T ON A.TransactionID=T.TransactionID GROUP BY A.ApplicationName