Sql 如果条件适用,则获取行,否则为单行
我有一个案例,其中我有两个表,Sql 如果条件适用,则获取行,否则为单行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个案例,其中我有两个表,客户和交易 许多客户可以组成一个客户组(记录在客户表中)。我需要在单个行中显示客户和特定金额(即每个组),如果该组的所有客户都有特定条件(数字列xCol 5)。如果其中任何一个(即至少一个)具有xCol=5,我需要显示所有客户,而不是组 客户表 Customer Group Customer Code ALPHA GROUP A 1 BETA GROUP A 2 GAMMA GROUP A 3 DELTA
客户
和交易
许多客户可以组成一个客户组(记录在客户
表中)。我需要在单个行中显示客户
和特定金额(即每个组),如果该组的所有客户都有特定条件(数字列xCol 5
)。如果其中任何一个(即至少一个)具有xCol=5
,我需要显示所有客户,而不是组
客户表
Customer Group Customer Code
ALPHA GROUP A 1
BETA GROUP A 2
GAMMA GROUP A 3
DELTA GROUP B 4
LAMDA GROUP B 5
交易表
Customer Code xCol Amount
1 1 4
2 1 4
3 1 4
4 5 1
5 2 2
在上述情况下,我需要展示以下内容:
Customer Group Amount
----- GROUP A 12
DELTA GROUP B 1
LAMDA GROUP B 2
提前感谢您试试:
with cte as
(select c.*,
t.Amount,
max(case xCol when 5 then 1 end) over (partition by c.[Group]) xCol5
from customers c
left join transactions t on c.[Customer Code] = t.[Customer Code])
select case xCol5 when 1 then [Customer Code] end [Customer Code],
[Group],
sum(Amount) Amount
from cte
group by [Group], case xCol5 when 1 then [Customer Code] end
需要一些优化,但您可以使用
SELECT *
FROM (SELECT tc.CUSTOMER, tc.GROUP, tt.AMNT AS AMOUNT
FROM CUSTOMERS tc
JOIN TRANSACTIONS tt
ON tc.CUST_CODE = tt.CUST_CODE
JOIN (SELECT DISTINCT tc.GROUP
FROM CUSTOMERS tc JOIN TRANSACTIONS tt
ON tt.CUST_CODE = tc.CUST_CODE
WHERE tt.XCOL = 5) spgrp
ON spgrp.GROUP = tc.GROUP)
UNION ALL
( SELECT '----' AS CUSTOMER, tc.GROUP, SUM (tt.AMNT) AS AMOUNT
FROM CUSTOMERS tc
JOIN TRANSACTIONS tt
ON tc.CUST_CODE = tt.CUST_CODE
JOIN ( ( SELECT DISTINCT GROUP FROM TEST_CUST)
MINUS
(SELECT DISTINCT tc.GROUP
FROM CUSTOMERS tc JOIN TRANSACTIONS tt
ON tt.CUST_CODE = tc.CUST_CODE
WHERE tt.XCOL = 5)) othgrp
ON othgrp.GROUP = tc.GROUP
GROUP BY tc.GROUP)
ORDER BY 2, 1
请发布这两个表中的一些示例数据以及您正在寻找的所需输出。这将非常有助于解释你想做什么。我已经编辑了最初的帖子,马哈茂德。谢谢您的建议。@brd:您所期望的输出似乎与您所描述的相反-您按组汇总没有xcol=5的客户,包括xcol=5的个人客户,与您最初描述的相反。你到底想要哪一个?@MarkBannister和tombom:是的,伙计们。我修正了最初的帖子。再次感谢。