Existe uma maneira de comparar valores em duas tabelas e gerar os nomes dos diferentes campos em uma única coluna?
Tabela Abril
EU IA | Nome_do_Fornecedor | País | CEP |
---|---|---|---|
1 | UM | EUA | 92883 |
2 | B | Reino Unido | 90523 |
Marcha da Mesa
EU IA | Nome_do_Fornecedor | País | CEP |
---|---|---|---|
1 | C | EUA | 92123 |
2 | B | EUA | 88888 |
Saída desejada
EU IA | Nome_do_Fornecedor | País | CEP | Mudanças na coluna |
---|---|---|---|---|
1 | UM | EUA | 92883 | Nome_do_Fornecedor; CEP |
2 | B | Reino Unido | 90523 | País; CEP |
Eu estava pensando em definir uma variável e um loop while, mas não sei como chamá-los nesta consulta.
DECLARE @Counter INT,
@FIELD_N AS VARCHAR(MAX), @FIELD_O AS VARCHAR(MAX),
@CONC AS VARCHAR(MAX), @FINAL AS VARCHAR(MAX)
SET @Counter = 5
WHILE (@Counter <= 64)
BEGIN
SET @FIELD_N = (SELECT CONCAT(t.name,'.',C.NAME)
FROM SYS.TABLES T
LEFT JOIN SYS.all_columns C ON T.object_id = C.object_id
WHERE T.NAME = 'APRIL'
AND COLUMN_ID NOT IN (1,2,4,63,61)
AND column_id = @Counter)
SET @FIELD_o = (SELECT CONCAT(t.name,'.',C.NAME)
FROM SYS.TABLES T
LEFT JOIN SYS.all_columns C ON T.object_id = C.object_id
WHERE T.NAME = 'March'
AND COLUMN_ID NOT IN (1,2,4,63,61)
AND column_id = @Counter)
SELECT ID,
CASE
WHEN April.Supplier_Name <> March.Supplier_Name
THEN 'Supplier_Name;'
ELSE ''
END AS Column_changes
FROM
April
LEFT JOIN
March ON April.Work_Package = March.Work_Package
WHERE
(ISNUMERIC(April.Work_Package) = 1
OR April.PROGRAM = 'AH64')
AND (ISNUMERIC(Proc_Plan_Sample.Work_Package) = 1
OR Proc_Plan_Sample.PROGRAM='Abc')
)
SET @Counter = @Counter + 1
SELECT @CONC
END
Aqui está uma solução rápida e prática que às vezes uso para comparar colunas (para SQL Server):
Isto é baseado na técnica unpivot dinâmica json:
SELECT a.* FOR json path
converte uma lista de colunas em json dentro do caminho for json, como:[{column":"value", "column2":"value2"}]
.openjson( (SELECT m.* FOR json path), '$[0]')
pega a primeira linha desta matriz e a converte em um conjunto de resultados no formato de:Isso funciona na maioria das vezes, a menos que você tenha alguns tipos de dados "estranhos" que o JSON não goste, ou precise de boa precisão com números, já que o OpenJSON converte coisas em strings, mas é assim que funciona. Na vida real, provavelmente é mais fácil simplesmente digitar as coisas.
Gostei da solução poderosa mostrada por @Siggemannen.
Também quero sugerir uma solução mais simples:
uma comparação simples de cada coluna.
A questão do caractere ";" no final da linha não é tão importante. A questão mais interessante é o que fazer se houver dados de clientes em um mês e não em outro.
abril
Marchar
violino