SQL - Как суммировать столбцы из 3 других запросов - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу получить 3 столбца в 3 таблицах, сгенерированных из запросов.Три таблицы: Payroll_Table, Misc_Table, Depreciation_Table.В каждой таблице есть столбцы Store_ID и Payroll_Expense или Misc_Expense или Depreciation_Expense.

Я пытаюсь получить общую сумму зарплаты, разного и амортизации для каждого Store_ID.

SELECT Store_ID, SUM(Payroll_Expense + Misc_Expense + Depreciation_Expense) AS Total
FROM (
SELECT Store_ID, Payroll_Expense FROM [Payroll_Table]UNION ALL
SELECT Store_ID, Misc_Expense AS FROM [Misc_Table] UNION ALL
SELECT Store_ID, Depreciation_Expense FROM [Depreciation_Table]
)
GROUP BY Store_ID

Если выполнить этот запросЯ получаю приглашение «Ввести значение параметра» для Misc_Expense и Depreciation_Expense.Если я введу 1, я получу правильное значение, но я не уверен, почему я получаю это приглашение.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Вы не можете ссылаться на разные имена столбцов, когда UNION вы должны ссылаться на индекс / позицию столбца или псевдоним столбцов, как это:

SELECT Store_ID, SUM(Expense) AS Total
FROM (
SELECT Store_ID, Payroll_Expense AS [Expense] FROM [Payroll_Table]UNION ALL
SELECT Store_ID, Misc_Expense AS [Expense] FROM [Misc_Table] UNION ALL
SELECT Store_ID, Depreciation_Expense AS [Expense] FROM [Depreciation_Table]
)
GROUP BY Store_ID
0 голосов
/ 30 ноября 2018

Таким образом, объединение генерирует только два столбца store_ID и "Expense" (фактически Payroll_Expense)

Система не знает, что такое misc_expense и depreciation_expense;вот почему вы получаете запрос на оба.Это можно увидеть, если вы сделаете select * из своей производной таблицы следующим образом:

SELECT * 
FROM (
SELECT Store_ID, Payroll_Expense Expense FROM [Payroll_Table]UNION ALL
SELECT Store_ID, Misc_Expense FROM [Misc_Table] UNION ALL
SELECT Store_ID, Depreciation_Expense FROM [Depreciation_Table]
) DerivedTable

Таким образом, исходя из этого, вы можете видеть, что нет столбца MISC_EXPENSE и Depreciation_Expense;все они свернуты в Payroll_Expense (Расход).Таким образом, производная таблица имеет только 2 столбца, а не 4, которые вы ожидали от внешнего выбора.Мы все еще можем получить 4;вам просто нужно использовать вариант 2 ниже;но нужно ли это?

Чтобы разрешить: Просто опустите Misc_Expense и Depreciation_Expense во внешнем запросе, так как они находятся в столбце «Расход» в результате и псевдоним столбца для потомков.

Имена столбцов и типы данных для каждого столбца в объединении наследуются от имен столбцов и типов данных первого запроса;если только null, то это первый встреченный тип данных.

Итак, мы можем просто сделать это:

SELECT Store_ID, SUM(Expense) AS Total
FROM (
SELECT Store_ID, Payroll_Expense AS Expense FROM [Payroll_Table]UNION ALL
SELECT Store_ID, Misc_Expense FROM [Misc_Table] UNION ALL
SELECT Store_ID, Depreciation_Expense FROM [Depreciation_Table]
) as DerivedTable
GROUP BY Store_ID

Если по какой-то причине вам все еще нужны все 3 столбца, тогда вам нужны заполнители для двух других столбцов.(ВАРИАНТ 2)

SELECT Store_ID, SUM(Payroll_Expense + Misc_Expense + Depreciation_Expense) AS Total
FROM (
SELECT Store_ID
     , Payroll_Expense
     , NULL as Misc_expense
     , Null as Depreciation_expense 
FROM [Payroll_Table] UNION ALL
SELECT Store_ID
     , NULL as Payroll_Expense
     , Misc_Expense
     , Null as Depreciation_expense
FROM [Misc_Table] UNION ALL
SELECT Store_ID
     , Null as Payroll_expense
     , Null as Misc_expense
     , Depreciation_Expense 
FROM [Depreciation_Table]
) as DerivedTable
GROUP BY Store_ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...