RefNo Title
----- -----
12 Check
12 With Sample
13 Cash
13 With Sample
14 Cash
14 Check
15 Deposit
15 Check
我有这个表,我想在下面输出。
RefNo Title Desc
----- ----- -----
12 Check With Sample
12 With Sample With Sample
13 Cash Hello
13 With Sample Hello
14 Cash Cash
14 Check Cash
15 Deposit Check
15 Check Check
基本上在具有相同RefNo的行中,Description具有此优先级:
如果有' With Sample'那么'使用Sample'
如果有'现金'和'使用Sample'那么'你好'
如果有'现金'然后'现金'
如果有'检查'那么'检查'
该描述适用于具有相同RefNo的所有行。谢谢。
答案 0 :(得分:2)
您需要对每组RefNo
行应用窗口化聚合:
WITH cte AS
(
SELECT
Max(CASE WHEN Title = 'With Sample' THEN 1 ELSE 0 end) Over (PARTITION BY RefNo) AS SampleFlag
,Max(CASE WHEN Title = 'Cash' THEN 1 ELSE 0 end) Over (PARTITION BY RefNo) AS CashFlag
,Max(CASE WHEN Title = 'Check' THEN 1 ELSE 0 end) Over (PARTITION BY RefNo) AS CheckFlag
...
FROM tab
)
SELECT
CASE
WHEN SampleFlag + CashFlag = 2 THEN 'Hello'
WHEN SampleFlag = 1 THEN 'With Sample'
WHEN CashFlag = 1 THEN 'Cash'
WHEN CheckFlag = 1 THEN 'Check'
END
...
FROM cte
答案 1 :(得分:0)
也许还有其他方法,但我的如下: -
XML PATH
根据ID连接值。 Case
切换条件。演示: -
declare @MyTable table (RefNo int ,Title varchar(20) )
insert into @MyTable values (12 , 'Check')
insert into @MyTable values (12 , 'With Sample')
insert into @MyTable values (13 , 'Cash')
insert into @MyTable values (13 , 'With Sample')
insert into @MyTable values (14 , 'Cash')
insert into @MyTable values (14 , 'Check')
insert into @MyTable values (15 , 'Deposit')
insert into @MyTable values (15 , 'Check')
select RefNo , Title , case
when ( SELECT Title + ','
FROM @MyTable p2
WHERE p1.RefNo = p2.RefNo
ORDER BY Title
FOR XML PATH('') ) like '%With Sample%'
AND
( SELECT Title + ','
FROM @MyTable p2
WHERE p1.RefNo = p2.RefNo
ORDER BY Title
FOR XML PATH('') ) not like '%Cash%'
then 'With Sample'
when ( SELECT Title + ','
FROM @MyTable p2
WHERE p1.RefNo = p2.RefNo
ORDER BY Title
FOR XML PATH('') ) like '%Cash,With Sample,%'
then 'Hello'
when ( SELECT Title + ','
FROM @MyTable p2
WHERE p1.RefNo = p2.RefNo
ORDER BY Title
FOR XML PATH('') ) like '%Cash%'
then 'Cash'
when ( SELECT Title + ','
FROM @MyTable p2
WHERE p1.RefNo = p2.RefNo
ORDER BY Title
FOR XML PATH('') ) like '%Check%'
then 'Check'
end [Desc]
from @MyTable p1
<强>结果: - 强>
答案 2 :(得分:0)
dnoeth的回答可能是最好的(它只需要修复其条件顺序,正如我评论的那样),但我想到了其他人可能会喜欢的方法:
WITH cte AS
(
SELECT RefNo, SUM(CASE Title WHEN 'With Sample' THEN 4 WHEN 'Cash' THEN 2 WHEN 'Check' THEN 1 END) Total
FROM YourTable
GROUP BY RefNo
)
SELECT YT.RefNo, Title, CASE
WHEN Total & 6 = 6 THEN 'Hello'
WHEN Total & 4 = 4 THEN 'With Sample'
WHEN Total & 2 = 2 THEN 'Cash'
WHEN Total & 1 = 1 THEN 'Check' END AS "Desc"
FROM YourTable YT
INNER JOIN cte ON YT.RefNo = cte.RefNo
如您所见,我为每个标题分配2个值的幂,然后使用按位运算符来识别每个案例。
答案 3 :(得分:-1)
查询下方将为您提供所需的结果
select t1.RefNo, t1.Title, case
WHEN (t1.Title = 'Check' AND t2.Title = 'With Sample') OR (t2.Title = 'Check' AND t1.Title = 'With Sample') Then 'With Sample'
WHEN (t1.Title = 'Cash' AND t2.Title = 'With Sample') OR (t2.Title = 'Cash' AND t1.Title = 'With Sample') Then 'Hello'
WHEN (t1.Title = 'Cash' AND t2.Title = 'Check') OR (t2.Title = 'Cash' AND t1.Title = 'Check') Then 'Cash'
WHEN (t1.Title = 'Check' AND t2.Title = 'Deposit') OR (t2.Title = 'Check' AND t1.Title = 'Deposit') Then 'Check'
END
from TestCase t1 cross join TestCase t2 where t1.Title != t2.Title and t1.RefNo = t2.RefNo