【发布时间】:2019-01-25 18:49:31
【问题描述】:
我正在寻找在提供的场景中生成结果集的最佳方法。我的 cust3 列没有识别 indvid2 列中的重复值。我正在寻找的最终结果是排除 key1 和 key2 匹配的行(ids:1,2,6 和 7),然后对 acctids 匹配的帐户求和。如果有更好的编码方法,我欢迎所有建议。谢谢!
WITH T10 as (
SELECT acctid,invid,(
case
when invid like '%-R' then left (InvID,LEN(invid) -2) else InvID
END) as InvID2
FROM table x
GROUP BY acctID,invID
),
T11 as (
SELECT acctid, Invid2, COUNT(InvID2) as cust3
FROM T10
GROUP BY InvID2,acctid
HAVING
COUNT (InvID2) > 1
)
select DISTINCT
a.acctid,
a.name,
b.invid,
C.invid2,
D.cust3,
b.amt,
b.key1,
b.key2
from table a
inner join table b (nolock) on a.acctid = b.acctid
inner join T10 C (nolock) on b.invid = c.invid
inner join T11 D (nolock) on C.invid2 = D.invid2
结果集
id acctID name invid invid2 Cust3 amt key1 key2
1 123 James 101 101 2 $500 NULL 6789
2 123 james 101-R 101 2 ($500) 6789 NULL
3 123 James 102 102 2 $350 NULL NULL
4 123 James 103 103 2 $200 NULL NULL
5 246 Tony 98-R 98 2 ($750) 7423 NULL
6 432 David 45 45 2 $100 NULL 9634
7 432 David 45-R 45 2 ($100) 9634 NULL
8 359 Stan 39-R 39 2 ($50) 6157 NULL
9 753 George 95 95 2 $365 NULL NULL
10 753 George 108 108 2 $100 NULL NULL
所需的结果集
id acctID name invid invid2 Cust3 amt key1 key2
1 123 James 101 101 2 $500 NULL 6789
2 123 james 101-R 101 2 ($500) 6789 NULL
3 123 James 102 102 1 $350 NULL NULL
4 123 James 103 103 1 $200 NULL NULL
5 246 Tony 98-R 98 1 ($750) 7423 NULL
6 432 David 45 45 2 $100 NULL 9634
7 432 David 45-R 45 2 ($100) 9634 NULL
8 359 Stan 39-R 39 1 ($50) 6157 NULL
9 753 George 95 95 1 $365 NULL NULL
10 753 George 108 108 1 $100 NULL NULL
然后通过acctid对amt求和
id acctid name amt
1 123 James $550
2 246 Tony ($750)
3 359 Stan ($50)
4 753 George $465
【问题讨论】:
-
不清楚。你说你想要 1、2、6 和 7,但它们在你想要的结果集中。然后你想求和?那么您是否正在寻找一个返回两个结果集的存储过程?
-
因此在所需结果集中,Cust3 列标识了我要排除的行项目。我可以在我的“Where”子句中执行这些操作......类似于 where cust3 '2',然后删除 invid、invid2、cust3 和 Key 列,然后对 acctID 匹配的“Amt”列求和。 .. 希望这有意义吗?
标签: sql sql-server database