表格中包含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子句中未选择的行。请帮忙
答案 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'
这个伪代码应该给你想要的结果。
这可能不是一个理想的查询。但这是你正在寻找的基本逻辑。