TSQL 仅在另一列中满足条件时对一列进行分组
TSQL only group a column when a condition is met in another column
本查询结果有多个transactionCodes。我只想在 applyToLineID = '0' 时对 transactionCodes 进行分组。换句话说,如果 applyToLineID 不是 0,则不应对事务代码进行分组。我认为这可以用 HAVING 语句来完成,但我无法让它工作。下面你会发现2段代码,第一段是我的原始代码,第二段是原始代码加上我尝试进行上述分组。
原码:
SELECT
ar.arlineitemid,
ar.siteid,
ar.transactioncode,
ar.description,
ar.amount,
ar.balance,
ar.applytolineid,
ar.posteddate,
TC.transactioncode,
TC.arlineitemid
FROM tswdata.dbo.t_arlineitem as AR
left JOIN
(
SELECT
ar2.transactioncode,
ar2.arlineitemid
FROM tswdata.dbo.t_arlineitem as ar2
WHERE
ar2.SiteID = '101'
AND
(AR2.Transactioncode LIKE 'A%' And
AR2.Transactioncode NOT LIKE 'AS%' And
AR2.Transactioncode NOT LIKE 'AF%' And
AR2.Transactioncode NOT LIKE 'AX%')
) TC
ON
ar.applytolineid = TC.arlineitemid
WHERE
ar.SiteID = '101'
AND
AR.Transactioncode <> 'A18'
我尝试执行条件分组的代码:
SELECT
ar.arlineitemid,
ar.siteid,
ar.transactioncode,
ar.description,
ar.amount,
ar.balance,
ar.applytolineid,
ar.posteddate,
TC.transactioncode,
TC.arlineitemid
FROM tswdata.dbo.t_arlineitem as AR
left JOIN
(
SELECT
ar2.transactioncode,
ar2.arlineitemid
FROM tswdata.dbo.t_arlineitem as ar2
WHERE
ar2.SiteID = '101'
AND
(AR2.Transactioncode LIKE 'A%' And
AR2.Transactioncode NOT LIKE 'AS%' And
AR2.Transactioncode NOT LIKE 'AF%' And
AR2.Transactioncode NOT LIKE 'AX%')
) TC
ON
ar.applytolineid = TC.arlineitemid
WHERE
ar.SiteID = '101'
AND
AR.Transactioncode <> 'A18'
GROUP BY
ar.transactioncode,
HAVING
ar.ApplyTolineId = '0'
您可以合并两个查询:一个包含除事务代码为 0 的项目之外的所有内容,另一个仅包含事务代码为 0 的项目的集合。
考虑像这样分解你的问题:
您有两组数据要查看 - 一组 applyToLineID = '0'
和一组 applyToLineID <> '0'
.
您有一个查询可以提取两个集合将用于评估 applyToLineID
逻辑的原始信息。
您的解决方案可能类似于:
SELECT * FROM
(select common data, Grouped Values from (common_query) where applyToLineID = 0)
UNION
SELECT * FROM
(select common data, unGrouped Values from (common_query) where applyToLineID <> 0)
本查询结果有多个transactionCodes。我只想在 applyToLineID = '0' 时对 transactionCodes 进行分组。换句话说,如果 applyToLineID 不是 0,则不应对事务代码进行分组。我认为这可以用 HAVING 语句来完成,但我无法让它工作。下面你会发现2段代码,第一段是我的原始代码,第二段是原始代码加上我尝试进行上述分组。
原码:
SELECT
ar.arlineitemid,
ar.siteid,
ar.transactioncode,
ar.description,
ar.amount,
ar.balance,
ar.applytolineid,
ar.posteddate,
TC.transactioncode,
TC.arlineitemid
FROM tswdata.dbo.t_arlineitem as AR
left JOIN
(
SELECT
ar2.transactioncode,
ar2.arlineitemid
FROM tswdata.dbo.t_arlineitem as ar2
WHERE
ar2.SiteID = '101'
AND
(AR2.Transactioncode LIKE 'A%' And
AR2.Transactioncode NOT LIKE 'AS%' And
AR2.Transactioncode NOT LIKE 'AF%' And
AR2.Transactioncode NOT LIKE 'AX%')
) TC
ON
ar.applytolineid = TC.arlineitemid
WHERE
ar.SiteID = '101'
AND
AR.Transactioncode <> 'A18'
我尝试执行条件分组的代码:
SELECT
ar.arlineitemid,
ar.siteid,
ar.transactioncode,
ar.description,
ar.amount,
ar.balance,
ar.applytolineid,
ar.posteddate,
TC.transactioncode,
TC.arlineitemid
FROM tswdata.dbo.t_arlineitem as AR
left JOIN
(
SELECT
ar2.transactioncode,
ar2.arlineitemid
FROM tswdata.dbo.t_arlineitem as ar2
WHERE
ar2.SiteID = '101'
AND
(AR2.Transactioncode LIKE 'A%' And
AR2.Transactioncode NOT LIKE 'AS%' And
AR2.Transactioncode NOT LIKE 'AF%' And
AR2.Transactioncode NOT LIKE 'AX%')
) TC
ON
ar.applytolineid = TC.arlineitemid
WHERE
ar.SiteID = '101'
AND
AR.Transactioncode <> 'A18'
GROUP BY
ar.transactioncode,
HAVING
ar.ApplyTolineId = '0'
您可以合并两个查询:一个包含除事务代码为 0 的项目之外的所有内容,另一个仅包含事务代码为 0 的项目的集合。
考虑像这样分解你的问题:
您有两组数据要查看 - 一组 applyToLineID = '0'
和一组 applyToLineID <> '0'
.
您有一个查询可以提取两个集合将用于评估 applyToLineID
逻辑的原始信息。
您的解决方案可能类似于:
SELECT * FROM
(select common data, Grouped Values from (common_query) where applyToLineID = 0)
UNION
SELECT * FROM
(select common data, unGrouped Values from (common_query) where applyToLineID <> 0)