基本需求是如果记录的属性为“紧急”,则属性值应显示在“紧急”列中。如果记录的属性值为“已关闭”,则属性值必须显示在“已关闭”列中。
我在下面有一个查询。我的问题是,在我回来的结果中,有两个记录具有相同的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
答案 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