SQL为其他列值选择行的唯一组合

时间:2019-07-07 12:47:42

标签: sql sql-server

我正在尝试分析每张发票的税种不同组合,以识别存在多少种情况。 在税表中,第1列是invoiceNo,第2列是taxType。这些构成了组合键。每个发票编号可以有1个或多个taxType。数据示例:

https://i.imgur.com/bcQc7vY_d.jpg?maxwidth=640&shape=thumb&fidelity=medium(很抱歉,我是新来的,所以无法添加图片)。

我希望能够为任何发票编号报告唯一的taxType。即,1 A是唯一的梳子1,2 AB是唯一的梳子2,3 A已被退回为1而忽略,而4 BC是唯一的梳子3。

不确定这是否有意义!很难表达我的追求!

预期输出为:

A
AB
BC

3 个答案:

答案 0 :(得分:1)

此问题的原始版本标记为MySQL,因此可以回答该问题。

如果我理解正确,则可以使用group_concat()

select distinct group_concat(taxtype order by taxtype)
from t
group by invoiceno;

答案 1 :(得分:0)

这适用于您提供的表,即使重复使用,也可以使用那些税种类型的组合,但是如果有更多的税种代码或AC组合,或者如果省略了某些给定的组合,则可以可能会有所不同!您可以开发此方法以适合条件,或者可以提供更多信息:发票是否具有三个代码(ABC)?发票只有B码还是C码?我注意到BC发票等

WITH CTE (RN,InvoiceNo,TT1,TT2) 
AS
(
SELECT ROW_NUMBER() OVER (ORDER BY a.InvoiceNo),a.InvoiceNo,a.TaxType,b.TaxType 
FROM UniqueCombo a INNER JOIN UniqueCombo b ON a.InvoiceNo=b.InvoiceNo
)
,
CTE2 (RN,InvoiceNo,TT1,TT2) 
AS
(
SELECT * FROM CTE WHERE RN IN
(
SELECT MAX(RN) FROM CTE WHERE TT1=TT2 GROUP BY InvoiceNo HAVING COUNT(InvoiceNo)=1
)
)
SELECT TT1 FROM CTE2 WHERE RN IN
(
SELECT MAX(RN) FROM CTE WHERE TT1=TT2 GROUP BY TT1,TT2 HAVING COUNT(InvoiceNo)>1
)
UNION
SELECT TT1+''+TT2 FROM CTE WHERE RN IN
(
SELECT MAX(RN)-1 FROM CTE WHERE TT1<>TT2 GROUP BY InvoiceNo
)

答案 2 :(得分:0)

您可以尝试STRING_AGG。像这样:

SELECT DISTINCT TaxTypeString
FROM
(
SELECT InvoiceNo, STRING_AGG(TaxType, '') AS TaxTypeString
FROM t
GROUP BY InvoiceNo
) x
ORDER BY TaxTypeString

称为x的嵌套查询应按您想要的格式为每个发票编号给您一行。然后,您必须从那里选择不同的税种。