SQL UNION.Результаты появляются в неправильных столбцах - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть этот длинный запрос SQL UNION.Итак, у меня есть две таблицы с одинаковыми именами столбцов, но потенциально разными данными.Я пишу этот запрос, чтобы проверить различия в столбцах обеих таблиц и показать разницу.Моя проблема в том, что различия возвращаются под неправильными столбцами.Все результаты возвращаются под заголовками столбцов в первом операторе SELECT.Я хочу, чтобы разные столбцы возвращались под правильными именами столбцов, чтобы было ясно, где они.Вот мой код и картина предполагаемого результата.Я поместил комментарии, рядом с которыми операторы SELECT возвращают различия.

SELECT DISTINCT --All Differences are coming under these headings
s.EEid,
CAST(s.Gross AS FLOAT) AS 'Star Gross',
CAST(pr.Gross AS FLOAT) AS 'PR Gross',
CAST(s.Gross AS FLOAT) - CAST(pr.Gross AS FLOAT) AS 'Gross Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Gross AS FLOAT) != CAST(pr.Gross AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.NetPay AS FLOAT) AS 'Star NetPay',
CAST(pr.NetPay AS FLOAT) AS 'PR NetPay',
CAST(s.NetPay AS FLOAT) - CAST(pr.NetPay AS FLOAT) AS 'NetPay Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.NetPay AS FLOAT) != CAST(pr.NetPay AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.StudentLoanDeductions AS FLOAT) AS 'Star StudentLoanDeductions',
CAST(pr.StudentLoanDeductions AS FLOAT) AS 'PR StudentLoanDeductions',
CAST(s.StudentLoanDeductions AS FLOAT) - CAST(pr.StudentLoanDeductions AS FLOAT) AS 'StudentLoanDeductions Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.StudentLoanDeductions AS FLOAT) != CAST(pr.StudentLoanDeductions AS FLOAT) AND s.PayCode = pr.PayCode

UNION 

SELECT DISTINCT --Different
s.EEid,
CAST(s.Total AS FLOAT) AS 'Star Total',
CAST(pr.Total AS FLOAT) AS 'PR Total',
CAST(s.Total AS FLOAT) - CAST(pr.Total AS FLOAT) AS 'Total Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Total AS FLOAT) != CAST(pr.Total AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT --Different
s.EEid,
CAST(s.Earnings_To_LEL AS FLOAT) AS 'Star EarningsToLEL',
CAST(pr.Earnings_To_LEL AS FLOAT) AS 'PR EarningsToLEL',
CAST(s.Earnings_To_LEL AS FLOAT) - CAST(pr.Earnings_To_LEL AS FLOAT) AS 'EarningsToLEL Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Earnings_To_LEL AS FLOAT) != CAST(pr.Earnings_To_LEL AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.Earnings_To_SET AS FLOAT) AS 'Star EarningsToSET',
CAST(pr.Earnings_To_SET AS FLOAT) AS 'PR EarningsToSET',
CAST(s.Earnings_To_SET AS FLOAT) - CAST(pr.Earnings_To_SET AS FLOAT) AS 'EarningsToSET Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Earnings_To_SET AS FLOAT) != CAST(pr.Earnings_To_SET AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT --Different
s.EEid,
CAST(s.Earnings_To_PET AS FLOAT) AS 'Star EarningsToPET',
CAST(pr.Earnings_To_PET AS FLOAT) AS 'PR EarningsToPET',
CAST(s.Earnings_To_PET AS FLOAT) - CAST(pr.Earnings_To_PET AS FLOAT) AS 'EarningsToPET Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Earnings_To_PET AS FLOAT) != CAST(pr.Earnings_To_PET AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT --Different
s.EEid,
CAST(s.Earnings_To_UST AS FLOAT) AS 'Star EarningsToUST',
CAST(pr.Earnings_To_UST AS FLOAT) AS 'PR EarningsToUST',
CAST(s.Earnings_To_UST AS FLOAT) - CAST(pr.Earnings_To_UST AS FLOAT) AS 'EarningsToUST Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Earnings_To_UST AS FLOAT) != CAST(pr.Earnings_To_UST AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.Earnings_To_AUST AS FLOAT) AS 'Star EarningsToAUST',
CAST(pr.Earnings_To_AUST AS FLOAT) AS 'PR EarningsToAUST',
CAST(s.Earnings_To_AUST AS FLOAT) - CAST(pr.Earnings_To_AUST AS FLOAT) AS 'EarningsToAUST Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Earnings_To_AUST AS FLOAT) != CAST(pr.Earnings_To_AUST AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.Earnings_To_UEL AS FLOAT) AS 'Star EarningsToUEL',
CAST(pr.Earnings_To_UEL AS FLOAT) AS 'PR EarningsToUEL',
CAST(s.Earnings_To_UEL AS FLOAT) - CAST(pr.Earnings_To_UEL AS FLOAT) AS 'EarningsToUEL Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Earnings_To_UEL AS FLOAT) != CAST(pr.Earnings_To_UEL AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.Earnings_Above_UEL AS FLOAT) AS 'Star EarningsAboveUEL',
CAST(pr.Earnings_Above_UEL AS FLOAT) AS 'PR EarningsAboveUEL',
CAST(s.Earnings_Above_UEL AS FLOAT) - CAST(pr.Earnings_Above_UEL AS FLOAT) AS 'EarningsAboveUEL Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Earnings_Above_UEL AS FLOAT) != CAST(pr.Earnings_Above_UEL AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT --Different
s.EEid,
CAST(s.Ee_Contributions_Pt1 AS FLOAT) AS 'Star EeContributionsPT1',
CAST(pr.Ee_Contributions_Pt1 AS FLOAT) AS 'PR EeContributionsPT1',
CAST(s.Ee_Contributions_Pt1 AS FLOAT) - CAST(pr.Ee_Contributions_Pt1 AS FLOAT) AS 'EeContributionsPT1 Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Ee_Contributions_Pt1 AS FLOAT) != CAST(pr.Ee_Contributions_Pt1 AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.Ee_Contributions_Pt2 AS FLOAT) AS 'Star EeContributionsPT2',
CAST(pr.Ee_Contributions_Pt2 AS FLOAT) AS 'PR EeContributionsPT2',
CAST(s.Ee_Contributions_Pt2 AS FLOAT) - CAST(pr.Ee_Contributions_Pt2 AS FLOAT) AS 'EeContributionsPT2 Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Ee_Contributions_Pt2 AS FLOAT) != CAST(pr.Ee_Contributions_Pt2 AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT --Different
s.EEid,
CAST(s.Er_Contributions AS FLOAT) AS 'Star ErContributions',
CAST(pr.Er_Contributions AS FLOAT) AS 'PR ErContributions',
CAST(s.Er_Contributions AS FLOAT) - CAST(pr.Er_Contributions AS FLOAT) AS 'ErContributions Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Er_Contributions AS FLOAT) != CAST(pr.Er_Contributions AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.Ee_Rebate AS FLOAT) AS 'Star EeRebate',
CAST(pr.Ee_Rebate AS FLOAT) AS 'PR EeRebate',
CAST(s.Ee_Rebate AS FLOAT) - CAST(pr.Ee_Rebate AS FLOAT) AS 'EeRebate Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Ee_Rebate AS FLOAT) != CAST(pr.Ee_Rebate AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.Er_Rebate AS FLOAT) AS 'Star ErRebate',
CAST(pr.Er_Rebate AS FLOAT) AS 'PR ErRebate',
CAST(s.Er_Rebate AS FLOAT) - CAST(pr.Er_Rebate AS FLOAT) AS 'ErRebate Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Er_Rebate AS FLOAT) != CAST(pr.Er_Rebate AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.Ee_Reduction AS FLOAT) AS 'Star EeReduction',
CAST(pr.Ee_Reduction AS FLOAT) AS 'PR EeReduction',
CAST(s.Ee_Reduction AS FLOAT) - CAST(pr.Ee_Reduction AS FLOAT) AS 'EeReduction Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.Ee_Reduction AS FLOAT) != CAST(pr.Ee_Reduction AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.TaxPreviousEmt AS FLOAT) AS 'Star TaxPreviousEmt',
CAST(pr.TaxPreviousEmt AS FLOAT) AS 'PR TaxPreviousEmt',
CAST(s.TaxPreviousEmt AS FLOAT) - CAST(pr.TaxPreviousEmt AS FLOAT) AS 'TaxPreviousEmt Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.TaxPreviousEmt AS FLOAT) != CAST(pr.TaxPreviousEmt AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.TaxablePayPreviousEmt AS FLOAT) AS 'Star TaxablePayPreviousEmt',
CAST(pr.TaxablePayPreviousEmt AS FLOAT) AS 'PR TaxablePayPreviousEmt',
CAST(s.TaxablePayPreviousEmt AS FLOAT) - CAST(pr.TaxablePayPreviousEmt AS FLOAT) AS 'TaxablePayPreviousEmt Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.TaxablePayPreviousEmt AS FLOAT) != CAST(pr.TaxablePayPreviousEmt AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.TaxThisEmt AS FLOAT) AS 'Star TaxThisEmt',
CAST(pr.TaxThisEmt AS FLOAT) AS 'PR TaxThisEmt',
CAST(s.TaxThisEmt AS FLOAT) - CAST(pr.TaxThisEmt AS FLOAT) AS 'TaxThisEmt Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.TaxThisEmt AS FLOAT) != CAST(pr.TaxThisEmt AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.TaxablePayThisEmt AS FLOAT) AS 'Star TaxablePayThisEmt',
CAST(pr.TaxablePayThisEmt AS FLOAT) AS 'PR TaxablePayThisEmt',
CAST(s.TaxablePayThisEmt AS FLOAT) - CAST(pr.TaxablePayThisEmt AS FLOAT) AS 'TaxablePayThisEmt Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.TaxablePayThisEmt AS FLOAT) != CAST(pr.TaxablePayThisEmt AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.AccYearBal AS FLOAT) AS 'Star AccYearBal',
CAST(pr.AccYearBal AS FLOAT) AS 'PR AccYearBal',
CAST(s.AccYearBal AS FLOAT) - CAST(pr.AccYearBal AS FLOAT) AS 'AccYearBal Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.AccYearBal AS FLOAT) != CAST(pr.AccYearBal AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.PAYEYearBal AS FLOAT) AS 'Star PAYEYearBal',
CAST(pr.PAYEYearBal AS FLOAT) AS 'PR PAYEYearBal',
CAST(s.PAYEYearBal AS FLOAT) - CAST(pr.PAYEYearBal AS FLOAT) AS 'PAYEYearBal Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.PAYEYearBal AS FLOAT) != CAST(pr.PAYEYearBal AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.ACCYearUnits AS FLOAT) AS 'Star ACCYearUnits',
CAST(pr.ACCYearUnits AS FLOAT) AS 'PR ACCYearUnits',
CAST(s.ACCYearUnits AS FLOAT) - CAST(pr.ACCYearUnits AS FLOAT) AS 'ACCYearUnits Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.ACCYearUnits AS FLOAT) != CAST(pr.ACCYearUnits AS FLOAT) AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
s.EEid,
CAST(s.PAYEYearUnits AS FLOAT) AS 'Star PAYEYearUnits',
CAST(pr.PAYEYearUnits AS FLOAT) AS 'PR PAYEYearUnits',
CAST(s.PAYEYearUnits AS FLOAT) - CAST(pr.PAYEYearUnits AS FLOAT) AS 'PAYEYearUnits Difference'
FROM starPayHistory s
INNER JOIN payRunPayHistory pr ON pr.EEid = s.EEid
WHERE CAST(s.PAYEYearUnits AS FLOAT) != CAST(pr.PAYEYearUnits AS FLOAT) AND s.PayCode = pr.PayCode

Вот изображение результатов.Как вы можете видеть, все результаты идут под неправильным названием заголовка. Любые рекомендации с благодарностью принимаются

ТАК вот пример ожидаемого результата.Столбцы с двумя разными значениями, а затем с разницей.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Отношение (таблица) состоит из заголовка и набора кортежей.В вашем примере запроса вы помещаете все столбцы CAST в один и тот же заголовок.Если вы хотите, чтобы они были в разных столбцах, вы можете добавить фиктивные столбцы и использовать агрегат на самом внешнем уровне, чтобы удалить их:

SELECT DISTINCT
    s.EEid,
    CAST(s.Gross AS FLOAT) AS 'Star Gross',
    CAST(pr.Gross AS FLOAT) AS 'PR Gross',
    CAST(s.Gross AS FLOAT) - CAST(pr.Gross AS FLOAT) AS 'Gross Difference',
    CAST(null as FLOAT) AS 'Star NetPay',
    CAST(null as FLOAT) AS 'PR NetPay',
    CAST(null as FLOAT) AS 'NetPay Difference'
FROM starPayHistory s
JOIN payRunPayHistory pr 
  ON pr.EEid = s.EEid
WHERE CAST(s.Gross AS FLOAT) != CAST(pr.Gross AS FLOAT) -- this looks dangerous 
  AND s.PayCode = pr.PayCode

UNION

SELECT DISTINCT
    s.EEid,
    CAST(null as FLOAT) AS ...,
    CAST(null as FLOAT) AS ...,
    CAST(null as FLOAT) AS ..., 
    CAST(s.NetPay AS FLOAT) AS 'Star NetPay',
    CAST(pr.NetPay AS FLOAT) AS 'PR NetPay',
    CAST(s.NetPay AS FLOAT) - CAST(pr.NetPay AS FLOAT) AS 'NetPay Difference'
FROM starPayHistory s
JOIN payRunPayHistory pr 
    ON pr.EEid = s.EEid
WHERE CAST(s.NetPay AS FLOAT) != CAST(pr.NetPay AS FLOAT) 
  AND s.PayCode = pr.PayCode

Некоторые замечания:

  • DISTINCT является избыточнымесли вы используете UNION
  • Сравнение поплавков может привести к неприятностям
  • <> - стандартный оператор! = работает в большинстве СУБД

Однако выглядит таквы используете те же таблицы для объединения, поэтому я думаю, что вы можете упростить ваш запрос, например:

SELECT DISTINCT
    s.EEid,
    CAST(s.Gross AS FLOAT) AS 'Star Gross',
    CAST(pr.Gross AS FLOAT) AS 'PR Gross',
    CAST(s.Gross AS FLOAT) - CAST(pr.Gross AS FLOAT) AS 'Gross Difference',
    CAST(s.NetPay AS FLOAT) AS 'Star NetPay',
    CAST(pr.NetPay AS FLOAT) AS 'PR NetPay',
    CAST(s.NetPay AS FLOAT) - CAST(pr.NetPay AS FLOAT) AS 'NetPay Difference'
FROM starPayHistory s
JOIN payRunPayHistory pr 
  ON pr.EEid = s.EEid
WHERE (s.Gross <> pr.Gross OR s.NetPay <> pr.NetPay)
  AND s.PayCode = pr.PayCode

Мне не ясно, что вы хотите сделать, когда значения равны, поэтому я оставлю эточасть.Вам, конечно, придется расширить запрос, включив в него дополнительные столбцы.

0 голосов
/ 17 декабря 2018

Я не понимаю вашу точку зрения, но вот несколько предложений, основанных на СУБД Oracle:

  • вам не нужно использовать DISTINCT в инструкции SELECT при использовании оператора set UNION - UNION автоматически удаляетлюбые дубликаты,
  • конечные псевдонимы столбцов поступают из первой команды SELECT - имена из второго и последующих SELECT не указываются,
  • столбцы должны иметь одинаковый тип данных, но не одинаковый тип данных - неявные преобразованияразрешены (например, '2' может быть автоматически преобразовано из строки в число),
  • проверьте оператор множества MINUS, если вы хотите получить eny-различия между результатами запросов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...