使用Sql进行数据库查询的统一记录

时间:2009-03-23 19:01:06

标签: sql database join

基本需求是如果记录的属性为“紧急”,则属性值应显示在“紧急”列中。如果记录的属性值为“已关闭”,则属性值必须显示在“已关闭”列中。

我在下面有一个查询。我的问题是,在我回来的结果中,有两个记录具有相同的RequesterID(一个在“紧急”列中具有有效值,一个在“已关闭”列中具有值) 我的问题是我需要将这两个特定记录显示为一条记录。

有什么想法吗?

SELECT DISTINCT 
   r.RequesterID,
   sr.ModifiedDate,
   p.FirstName + ' ' + p.LastName AS RequesterName,
   CASE
     WHEN sa.Attribute = 'Urgent' THEN sa.AttributeValue
     ELSE NULL
   END AS Urgent,
   CASE
     WHEN sa.Attribute = 'Closed' THEN sa.AttributeValue 
     ELSE NULL
   END AS Closed
FROM
   Requester AS r 
   INNER JOIN SubRequester AS sr 
     ON r.RequesterID = sr.RequesterID
   INNER JOIN SubRequesterAttribute AS sa
     ON sr.SubRequesterID = sa.SubRequesterID
   CROSS JOIN Personnel AS p
WHERE 
     (r.UserID = p.ContractorID
     OR r.UserID = p.EmployeeID)
   AND 
     (sa.Attribute IN ('Urgent', 'Closed'))
GROUP BY r.RequesterID, sr.ModifiedDate, p.FirstName, p.LastName, 
   sa.Attribute, sa.AttributeValue

1 个答案:

答案 0 :(得分:0)

通常,如果您有多行并希望将它们合并为一行,则GROUP BY是实现此目的的基本工具。看起来你试图走向那个方向,但并没有完全达到目的。您要做的是按行之间重复的表达式进行分组,并将组函数应用于将消除NULL值的其他表达式。我在下面的示例中使用了MIN,但您可以轻松使用MAX;关键是,因为最多其中一行将具有该表达式的值,该值既是最小值也是最大值。

SELECT
   r.RequesterID,
   sr.ModifiedDate,
   p.FirstName + ' ' + p.LastName AS RequesterName,
   MIN(
   CASE
     WHEN sa.Attribute = 'Urgent' THEN sa.AttributeValue
     ELSE NULL
   END
   ) AS Urgent,
   MIN(
   CASE
     WHEN sa.Attribute = 'Closed' THEN sa.AttributeValue 
     ELSE NULL
   END
   ) AS Closed
FROM
   Requester AS r 
   INNER JOIN SubRequester AS sr 
     ON r.RequesterID = sr.RequesterID
   INNER JOIN SubRequesterAttribute AS sa
     ON sr.SubRequesterID = sa.SubRequesterID
   CROSS JOIN Personnel AS p
WHERE 
     (r.UserID = p.ContractorID
     OR r.UserID = p.EmployeeID)
   AND 
     (sa.Attribute IN ('Urgent', 'Closed'))
GROUP BY r.RequesterID, sr.ModifiedDate, p.FirstName + ' ' + p.LastName