子查询中求和权重时的SQL DISTINCT id

子查询中求和权重时的SQL DISTINCT id,sql,sql-server,distinct,Sql,Sql Server,Distinct,我在语句中有两种类型的子查询。 首先是一些样本数据 桌子 一个子查询是按预期工作的不同ID的计数 ( SELECT COUNT (distinct t1.ID) FROM table t1 WHERE t1.group = 'A' GROUP BY t1.cat) AS [count], 另一个子查询是权重的总和 ( SELECT SUM(t1.weight) FROM table t1 WHERE t1.group = 'A' GROUP BY t1.cat) AS [weight],

我在语句中有两种类型的子查询。 首先是一些样本数据

桌子

一个子查询是按预期工作的不同ID的计数

( SELECT COUNT (distinct t1.ID) 
FROM table t1
WHERE t1.group = 'A'
GROUP BY t1.cat)
AS [count],
另一个子查询是权重的总和

( SELECT SUM(t1.weight) 
FROM table t1
WHERE t1.group = 'A'
GROUP BY t1.cat)
AS [weight],
这并没有给我我所需要的,因为当我想要它总计400时,它将总计600,因为我只想像第一个查询那样使用唯一ID

然而,通过添加不同的

( SELECT SUM(DISTINCT t1.weight) 
FROM table t1
WHERE t1.group = 'A'
GROUP BY t1.cat)
AS [weight],
这只返回200,因为它使用的是不同的权重,我希望它在这里使用不同的ID,但我如何在仍然只选择权重的情况下执行此操作

从逻辑上讲,这是行不通的

( SELECT SUM(t1.weight) 
FROM table t1
WHERE t1.group = 'A'
AND t1.ID IS DISTINCT
GROUP BY t1.cat)
AS [weight],

我可能遗漏了一些东西,因为我已经查看了您的样本数据,并且我相信这是您想要的输出,但是您能否不只是简单地进行分组和求和:

制作:

ID  Counter SumWeight
1   2       400
4   1       200

t1上有主键吗?两个相同的ID是否有不同的权重?但是,如果一个t1.cat有两个不同的值,如何选择t1.weight?在示例数据中添加另一行,1 1400 a。这并不漂亮,但是;它有用吗?选择SUMsubTable.weight FROM SELECT t1.ID As ID,MAXt1.weight As weight,t1.GROUP As GROUP FROM table t1 GROUP BY t1.ID,t1.GROUP subTable WHERE subTable.GROUP='A'GROUP BY subTable.cat As[weight],@Matt您自己运行上述sql时会出现此错误吗?我猜不是。@Matt那是因为您的子查询正在执行一个IN。。。或者类似的东西,所以不能只放置my查询,它返回3列,而不是子查询需要一列。这只是演示如何获得所需输出的逻辑,这需要以某种方式对主查询进行重构。@Matt如果您将主查询发布到某个在线位置,以便我们可以查看它,这可能会有所帮助。上面的一个单独就行了。您的代码可以使用它:是as tb1修复了它!
 SELECT cat,SUM(weight) AS [weight] FROM 
(SELECT *,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) as rn
 FROM table ) as tbl
WHERE [group] = 'A' AND rn=1
GROUP BY cat
CREATE TABLE SampleData
    ([CAT] int, [ID] int, [Weight] int, [GROUP] varchar(1))
;

INSERT INTO SampleData
    ([CAT], [ID], [Weight], [GROUP])
VALUES
    (1, 1, 200, 'A'),
    (1, 2, 300, 'B'),
    (1, 3, 250, 'B'),
    (1, 1, 200, 'A'),
    (1, 4, 200, 'A')
;

SELECT ID, COUNT(ID) AS [Counter], SUM(Weight) AS SumWeight
FROM SampleData
WHERE [GROUP] = 'A'
GROUP BY ID
ID  Counter SumWeight
1   2       400
4   1       200