SQL-запрос с использованием перекрестного применения для условного получения суммы

Вывод, который необходимо произвести

введите здесь описание изображения

используя это как ссылку, но теперь с другим сценарием запрос SQL Server: получить сумму условно< /а>

пояснение:

Столбцы «Элемент», «Продажи» и «Примечания» представляют собой столбец из базы данных. Столбец «Новые продажи» представляет собой сформулированный столбец, в котором он получает сумму элементов с одинаковыми примечаниями по ключевым словам, за исключением примечаний по умолчанию n/a.

(несмотря на то, что примечания не полностью идентичны, по крайней мере, есть общее сходство, как на изображении выше - в пункте 5 есть «новое», но он суммируется с пунктом 6, потому что их похожее ключевое слово найдено «маленький»)

используемый код

ПЕРВЫЙ ВАРИАНТ — использование раздела. Это не работает, потому что, когда примечания не идентичны друг другу, сумма не будет получена должным образом (для элемента 5 и элемента 6).

 CASE
     WHEN ([remarks] not  like '%big%') AND ([remarks] not  like '%PAENGS%') 


     THEN sales 
     ELSE SUM(sales) OVER(PARTITION BY [remarks])
     END as 'New Sales'

ВТОРОЙ ВАРИАНТ — использование перекрестного применения. Так что я оставляю это, но я растерялся, так как он не дает желаемого результата.

 CROSS APPLY
     SELECT
        d.*, 
        NewSales = 
        CASE
        WHEN ([remarks] not like '%big%') or ([remarks] not like '%small%')
        THEN Sales 
        ELSE x.NewSales
        END


        FROM #MSRSuperFinal3  d
        CROSS APPLY(SELECT NewSales = SUM(Sales)
                    FROM #MSRSuperFinal3 
                    WHERE ([remarks] like  '%big%') or ([remarks] like  '%small%')
        )x

Любая помощь будет высоко оценена


person rickyProgrammer    schedule 01.07.2015    source источник
comment
Вы можете добавить некоторые данные вместо изображения или дать скрипку?   -  person Kaf    schedule 01.07.2015
comment
@wewestthemenace, пожалуйста, помогите мне с этим   -  person rickyProgrammer    schedule 02.07.2015


Ответы (3)


Использование CROSS APPLY

SELECT *
FROM temp t
CROSS APPLY(
    SELECT SUM(sales)
    FROM temp
    WHERE
        remarks LIKE '%' + t.remarks + '%'
        OR t.remarks LIKE '%' + remarks + '%'
)x(NewSales)
WHERE remarks <> 'n/a'

UNION ALL

SELECT *, 
    NewSales = sales
FROM temp
WHERE remarks = 'n/a'
ORDER BY item

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

SELECT * 
FROM #MSRSuperFinal3 t
CROSS APPLY( 
    SELECT 
        SUM(CurrentMonth)
    FROM #MSRSuperFinal3 
    WHERE 
        t.misc LIKE '%' + misc + '%'
        OR misc LIKE '%' + t.misc + '%'
)x(NewSales) 
WHERE 
    ([misc] LIKE '%BIGKAHUNA%') 
    or ([misc] LIKE '%PAENGS%') 

UNION ALL 
SELECT *, 
    NewSales = CurrentMonth 
FROM #MSRSuperFinal3 
WHERE 
    ([misc] not like '%BIGKAHUNA%')
    AND ([misc] not like '%PAENGS%')
    AND ([misc] not like '%ROBINSONS%')
ORDER BY location, name 
person Felix Pamittan    schedule 02.07.2015
comment
Привет, а что такое темп? временная таблица? - person rickyProgrammer; 02.07.2015
comment
О, это просто заполнитель для вашей таблицы #MSRSuperFinal3. - person Felix Pamittan; 02.07.2015
comment
Я следую вашим кодам и заменяю необходимые столбцы на основе моих исходных столбцов, и это не сработало. :( - person rickyProgrammer; 02.07.2015
comment
Можете ли вы опубликовать свой запрос? - person Felix Pamittan; 02.07.2015
comment
Во-первых, я понимаю, что первый запрос с перекрестным применением получает элементы / арендаторы, которые подлежат вычислению суммы, затем второй будет остальным, кроме выбранных элементов в первом, они будут объединены с помощью СОЮЗ ВСЕХ. Я изменил некоторые, потому что в фактических данных это не всегда Н/Д, некоторые пустые/пустые, некоторые просто нет, нет и многое другое, так что вот что я сделал на основе вашего кода. - person rickyProgrammer; 02.07.2015
comment
SELECT * FROM #MSRSuperFinal3 CROSS APPLY( SELECT SUM(CurrentMonth) FROM #MSRSuperFinal3 WHERE ([misc] LIKE '%BIGKAHUNA%') --AND ([misc] LIKE '%PAENGS%') )x(NewSales) WHERE ([ разное] LIKE '%BIGKAHUNA%') или ([misc] LIKE '%PAENGS%') UNION ALL SELECT *, NewSales = CurrentMonth FROM #MSRSuperFinal3 WHERE ([misc] не нравится '%BIGKAHUNA%') AND ([misc] не похоже на '%PAENGS%') И ([разное] не похоже на '%ROBINSONS%') ORDER BY местоположение, имя - person rickyProgrammer; 02.07.2015
comment
Ваш запрос отличается от моего. Используйте LIKE в CROSS APPLY. - person Felix Pamittan; 02.07.2015
comment
Давайте продолжим обсуждение в чате. - person rickyProgrammer; 02.07.2015

Попробуйте использовать предложение Left Join вместо Cross Apply:

SELECT a.item,
       a.sales,
       a.remarks,
       CASE
           WHEN a.remarks = 'n/a' 
           THEN a.sales
           ELSE SUM( b.sales )
       END AS [New Sales]
FROM query_using_cross_apply_to_get_sum_conditionally a
LEFT JOIN query_using_cross_apply_to_get_sum_conditionally b 
      ON(a.remarks LIKE '%' + b.remarks + '%'
         AND b.remarks != 'n/a')
GROUP BY a.item, a.sales, a.remarks;
person Miyazawa    schedule 01.07.2015

CASE
    WHEN (a.[remarks] <> 'n/a') THEN a.sales 
    ELSE 
    (
        SELECT SUM(b.sales) 
        FROM #MSRSuperFinal3 b
        WHERE b.[remark] LIKE '%' + a.[remarks] + '%'
    )
END as 'New Sales'

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

person Hano Johannes Rossouw    schedule 01.07.2015