#sql-server #tsql #union
#sql-server #tsql #объединение
Вопрос:
Я хочу объединить 2 таблицы в 1 и вернуть их в 1 строку для каждого уникального идентификатора
SELECT
try_convert(nvarchar(3), StockRec.CustNo) AS [CustNo]
,try_convert(nvarchar(3), StockRec.LocationNo) AS [LocationNo]
,try_convert(nvarchar(8), StockRec.ItemNo) AS [ItemNo]
,try_convert(nvarchar(20), StockRec.Location) AS [Location]
,try_convert(nvarchar(20), StockRec.Container) AS [Container]
FROM
( SELECT
CustNo
, LocationNo
, ItemNo
, Location
, Container
FROM CustPurchases
UNION ALL
SELECT
CustNo
, LocationNo
, ItemNo
, Location
, Container
FROM CustomerSales
)StockRec
CustPurchases выглядит так
и CustomerSales выглядит так
Однако, когда я запускаю запрос, я получаю 10 строк обратно вместо 5
Комментарии:
1. Согласен с ответом Гордона. В случае возникновения путаницы в объединении и объединении, подумайте об этом так: объединение объединит результаты или «сложит» их. Объединение объединит результаты (вообще говоря, в зависимости от запроса) и в некотором смысле получит «комбинированный» набор результатов.
2. Пожалуйста, прочтите это для получения нескольких советов по улучшению вашего вопроса.
Ответ №1:
Если вы хотите пять рядов, я думаю, вы хотите join
:
select . . . -- the columns you want
from CustPurchases cp join
CustSales cs
on cs.custno = cp.custno;
Ответ №2:
Попробуйте использовать агрегирование с помощью group by
SELECT
CustNo
,LocationNo
,ItemNo
,max(Location)
,max(Container)
FROM
( SELECT
CustNo
, LocationNo
, ItemNo
, Location
, Container
FROM CustPurchases
UNION ALL
SELECT
CustNo
, LocationNo
, ItemNo
, Location
, Container
FROM CustomerSales
)StockRec group by CustNo
,LocationNo
,ItemNo
Комментарии:
1. если у меня есть дополнительные столбцы? цена, уплаченная в CustPurchases, будет равна нулю в custSales, другим столбцом будет цена покупки в CustSales, которая будет равна нулю в CustPurchases, и в верхнем выборе мы рассчитаем цену покупки — уплаченную цену. Даст ли сумма (цена покупки — оплаченная цена) правильный результат?