SQL Выберите уникальные комбинации строк для другого значения столбца - PullRequest
0 голосов
/ 07 июля 2019

Я пытаюсь провести анализ различных комбинаций налогов на счет-фактуру, чтобы определить, сколько существует сценариев. В таблице налогов столбец 1 - invoiceNo, столбец 2 - taxType. Они образуют составной ключ. Может быть 1 или более taxType для счета-фактурыNo. Пример данных:

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 ]

1 голос
/ 07 июля 2019

Первоначальная версия этого вопроса была помечена MySQL, так что это отвечает на вопрос.

Если я правильно понимаю, вы можете использовать group_concat():

select distinct group_concat(taxtype order by taxtype)
from t
group by invoiceno;
0 голосов
/ 07 июля 2019

Вы можете попробовать STRING_AGG.Примерно так:

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

Вложенный запрос, называемый x, должен давать вам по одной строке на номер счета в нужном формате.Затем вам нужно выбрать отдельные виды налогов оттуда.

0 голосов
/ 07 июля 2019

Это работает с таблицей, которую вы дали, и будет работать с этими комбинациями типов налогов, даже если они повторяются, но если есть больше налоговых кодов, или есть комбинация 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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...