总结未在where子句中选择的行

时间:2011-12-14 06:13:39

标签: sql

表格中包含4列的示例数据:

1st row           A1    B1  C1  D1

2nd row           A1    B2  C2  D2

3rd row           A1    B3  C3  D3

4th row           A2    B1  C4  D4

5th row           A2    B4  C5  D5

6th row           A3    B1  C6  D6

我想* 为满足条件COL-B = B1的行选择所有列 * s 另外,对于COL-D

的每个选定值,我需要COL-A的总和

输出数据

1st row           A1    B1  C1  D1+D2+D3

2nd row           A2    B1  C4  D4+D5

3rd row           A3    B1  C6  D6

我无法弄清楚如何总结在where子句中未选择的行。请帮忙

3 个答案:

答案 0 :(得分:2)

以下两项中的一项应该有效:

SELECT A,B,C,(select SUM(D) from Table t2 where t2.A = t.A)
FROM Table t
WHERE t.B = 'B2'

或:

SELECT t.A,t.B,t.C,t2.D
FROM Table t
   inner join
       (select A,SUM(D) as D from Table) t2
      on
          t.A = t2.A
WHERE
    t.B = 'B2'

哪一个表现更好通常取决于表中总共有多少行,有多少行B = 'B2',以及有多少相关行(匹配{{1} } value)存在。


或者,另一个:

A

哪个可能更有效(应该只导致单个表扫描 - 这里我假设表中的大多数行应该在结果集中结束)

答案 1 :(得分:1)

如果您想在单个查询中使用求和和过滤条件,则需要使用子查询和分组,如下所示:

DECLARE @Table TABLE (Col1 VARCHAR(10), Col2 VARCHAR(10), Col3 VARCHAR(10), Col4 INT)

INSERT INTO @Table VALUES ('A1','B1','C1',1) 
INSERT INTO @Table VALUES ('A1','B2','C2',1)
INSERT INTO @Table VALUES ('A1','B3','C3',1)
INSERT INTO @Table VALUES ('A2','B1','C4',1)
INSERT INTO @Table VALUES ('A2','B4','C5',1)
INSERT INTO @Table VALUES ('A3','B1','C6',1)

SELECT  Col1, 
        (SELECT TOP 1 Col2 FROM @Table WHERE Col1 = MainTable.Col1) Col2,
        (SELECT TOP 1 Col3 FROM @Table WHERE Col1 = MainTable.Col1) Col3,
        SUM(Col4) AS Total 
FROM @Table MainTable
GROUP BY Col1

但是在这里你的B1滤波器的条件不会满足每种情况。这只是你提到的输出。如果没有任何记录,例如Col1 = A4,那么它将获得col2中的任何值,如record =>> 'A4','B2','C6',1,它将返回B2。

更新:参考。来自Damien_The_Unbeliever的帖子

对于A4案,我认为你需要这样做:

SELECT  Col1,
        Col2,
        Col3,
        (SELECT SUM(Col4) FROM @Table t2 WHERE t2.Col1 = t.Col1) 
FROM @Table t 
WHERE t.Col2 = 'B1' 

答案 2 :(得分:0)

如果我使用SQL解决此问题,我会先按列A进行分组,然后找到列D的总和。

此查询将使用内部查询,并将对B='B1'进行过滤。

select inn.A,inn.sum_d, Tb.B 
from (
    //inner query
    select A, sum(D) sum_d 
    from <table> Ta 
    group by A
) inn,
<table> Tb
where 
//join inner query output to table Tb.w here Ta and Tb are same table with 2 different alias name.
inn.A=Tb.A
and Tb.B= 'B1'

这个伪代码应该给你想要的结果。

这可能不是一个理想的查询。但这是你正在寻找的基本逻辑。