我在网上看了一些例子,遗憾的是没有找到解决方案。
我有这样的数据。
表A
TaskName Pattern
123 Did not find A
124 Did not find B
此表B
中生成数据模式VariantId LocalVariantId Pattern
345 222 Did not find A
345 223 Did not find A
345 224 <Something else>
346 234 Did not find A
表C
VariantId ParseRange
345 100
345 200
346 50
我需要结合三个表中的数据来生成像这样的数据
TaskName ParseRange
123 250
250
是max(345) + max(346) = 200 + 50
我已编写查询,但问题在Table B
中是重复的。
从Table C
,我做
select max(ParseRange) from TableC group by VariantId
这样我就可以200
(VariantId=345
)
然而,当我加入Table B
时,除非我这样做
group by TableB.VariantId
,
我得到了重复项,因此结果总和与250
不一样。
这就像我的查询
SELECT
TaskName
, SUM(TC.ParseRange)
FROM
TableB
JOIN
(
SELECT
VariantId
, MAX(ParseRange)
FROM TableC
GROUP BY VariantId
) AS TC ON TableB.VariantId = TC.VariantId
-- also join with table A on Pattern
GROUP BY TaskName
答案 0 :(得分:0)
以下是一种可能的解决方案:SQL Fiddle
示例数据
DECLARE @TableA TABLE (TaskName int, Pattern varchar(50));
INSERT INTO @TableA ([TaskName], [Pattern]) VALUES
(123, 'Did not find A'),
(124, 'Did not find B');
DECLARE @TableB TABLE ([VariantId] int, [LocalVariantId] int, [Pattern] varchar(50));
INSERT INTO @TableB ([VariantId], [LocalVariantId], [Pattern]) VALUES
(345, 222, 'Did not find A'),
(345, 223, 'Did not find A'),
(345, 224, '<Something else>'),
(346, 234, 'Did not find A');
DECLARE @TableC TABLE ([VariantId] int, [ParseRange] int);
INSERT INTO @TableC ([VariantId], [ParseRange]) VALUES
(345, 100),
(345, 200),
(346, 50);
<强>解决方案强>
首先,我们列出了来自TableC
的所有变体及其最大ParseRange
- 这是CTE_Variants
。
然后,对于每个VariantId
,我们需要从TaskName
中找到TableA
。 CROSS APPLY
执行此操作 - 对于每个VariantId
,我们从TableA
选择一个与TOP(1)
相关的行。在此示例中,选择哪一行并不重要,因此CROSS APPLY
内的查询没有ORDER BY
。如果您的数据更复杂,您可能需要添加排序以选择正确的行。
然后按TaskName
对结果进行分组,以计算最终总和。
WITH
CTE_Variants
AS
(
SELECT
VariantId
,MAX(ParseRange) AS MaxParseRange
FROM @TableC
GROUP BY VariantId
)
SELECT
CA.TaskName
, SUM(CTE_Variants.MaxParseRange) AS SumMaxParseRange
FROM
CTE_Variants
CROSS APPLY
(
SELECT TOP(1) TA.TaskName
FROM
@TableB AS TB
INNER JOIN @TableA AS TA ON TA.Pattern = TB.Pattern
WHERE
TB.VariantId = CTE_Variants.VariantId
) AS CA
GROUP BY
CA.TaskName
;
结果集
TaskName SumMaxParseRange
123 250