Наружное применение для распределения строк - PullRequest
1 голос
/ 20 марта 2020

У меня есть таблица, которая содержит названия различных продуктов, таких как;

      ItemName
1   FRESH BREAD
2   FRESH TOMATO
3   FRESH POTATO

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

select shipment.RutPlanId
        ,shipment.ShipmentDateTime
        ,shipment.DeliveryLocationName
        ,shipment.Quantity
        from TABLE_SHIPMENT as shipment
        left join TABLE_ITEM as item on item.No_ = shipment.ItemNo
        where shipment.RutPlanId = 2 and item.Description like '%FRESH%'

И результат запроса объединения:

       RutPlanId    ShipmentDateTime            DeliveryLocationName    ItemName       Quantity
  1        2       2020-03-11 00:00:00.000            ZONGULDAK        FRESH BREAD       110
  2        2       2020-03-11 00:00:00.000             KANYON          FRESH TOMATO      189

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

RutPlanId   ShipmentDateTime    DeliveryLocationName    ItemName     Quantity
2             2020-03-11              KANYON           FRESH BREAD      0
2             2020-03-11              KANYON           FRESH POTATO     0
2             2020-03-11              KANYON           FRESH TOMATO    189
2             2020-03-11              ZONGULDAK        FRESH BREAD     110
2             2020-03-11              ZONGULDAK        FRESH POTATO     0
2             2020-03-11              ZONGULDAK        FRESH TOMATO     0

Чтобы получить результат, указанный выше, я попытался написать запрос

select RootInfo.RutPlanId
        ,RootInfo.ShipmentDateTime
        ,RootInfo.DeliveryLocationName 
        ,product.ItemName
        ,ISNULL(shipment.Quantity,0) Quantity
                --select vt.Type  
    from TABLE_PRODUCT_NAMES as product
    left join TABLE_ITEM as item on item.ItemName = product.ItemName
    left join TABLE_SHIPMENT as shipment on shipment.ItemNo = item.No_ and otm.RutPlanId = 2
    outer APPLY(
                select *
                from TABLE_SHIPMENT pl
                where pl.RutPlanId= 2
                )RootInfo
    group by RootInfo.RutPlanId
        ,RootInfo.ShipmentDateTime
        ,RootInfo.DeliveryLocationName
        ,shipment.Quantity
        ,product.ItemName

Но приведенный выше запрос дает мне результат, который мне не нужен. Это дает что-то вроде этого:

RutPlanId   ShipmentDateTime    DeliveryLocationName         ItemName         Quantity
    2             2020-03-11              KANYON           FRESH BREAD          0
    2             2020-03-11              KANYON           FRESH POTATO        110
    2             2020-03-11              KANYON           FRESH TOMATO        189
    2             2020-03-11              ZONGULDAK        FRESH BREAD          0
    2             2020-03-11              ZONGULDAK        FRESH POTATO        110
    2             2020-03-11              ZONGULDAK        FRESH TOMATO        189

Как мне достичь своей цели и что я должен исправить в моем последнем запросе? Заранее спасибо.

1 Ответ

1 голос
/ 20 марта 2020

Как насчет CROSS JOIN?

Пример

 ;with cte as (
   -- Your Original Query here
 )
 Select A.[RutPlanId]
       ,A.[ShipmentDateTime]
       ,A.[DeliveryLocationName] 
       ,B.[ItemName]
       ,[Quantity] = case when A.[ItemName]=B.[ItemName] then [Quantity] else 0 end
  From  cte A
  Cross Join Products B

Возвращает

RutPlanId   ShipmentDateTime        DeliveryLocationName    ItemName      Quantity
2           2020-03-11 00:00:00.000 ZONGULDAK               FRESH BREAD   110
2           2020-03-11 00:00:00.000 KANYON                  FRESH BREAD   0
2           2020-03-11 00:00:00.000 ZONGULDAK               FRESH TOMATO  0
2           2020-03-11 00:00:00.000 KANYON                  FRESH TOMATO  189
2           2020-03-11 00:00:00.000 ZONGULDAK               FRESH POTATO  0
2           2020-03-11 00:00:00.000 KANYON                  FRESH POTATO  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...