T-SQL — Объединить две таблицы без создания временной таблицы

#sql #tsql #merge

#sql #tsql #объединить

Вопрос:

Желаемый результат, который я хочу , у меня есть эти 2 запроса T-SQL:

 SELECT 
    CONVERT(NVARCHAR, AL.FECHA, 103) AS [DATE], 
    CONVERT(NVARCHAR, AL.HORA, 108) AS [HOUR], 
    SUM(CAST(AL.TOTALNETO AS money)) AS [AMOUNT]
FROM
    ALBVENTACAB AL
WHERE 
    CONVERT(NVARCHAR, AL.FECHA, 103) = '10/09/2020' 
    -- AND CONVERT(nvarchar, GETDATE(), 103) AND
    AND CONVERT(nvarchar, AL.HORA, 108) BETWEEN (SELECT CONVERT(nvarchar, AL.HORA, 108)) AND CONVERT(nvarchar, GETDATE(), 108)
GROUP BY 
    AL.FECHA, AL.HORA
ORDER BY 
    AL.FECHA

SELECT 
    CONVERT(NVARCHAR, AL.FECHA, 103) AS [DATE], 
    CONVERT(NVARCHAR, AL.HORA, 108) AS [HOUR], 
    SUM(CAST(AL.TOTALNETO AS money)) AS [AMOUNT]
FROM 
    ALBVENTACAB AL
WHERE 
    FECHA = CAST(DATEADD(DD, -7, GETDATE()) AS date) 
    AND CONVERT(nvarchar, AL.HORA, 108) BETWEEN (SELECT CONVERT(nvarchar, AL.HORA, 108)) AND CONVERT(nvarchar, GETDATE(), 108)
GROUP BY 
    AL.FECHA, AL.HORA
ORDER BY 
    AL.FECHA
  

По отдельности их результаты верны. Я хочу создать результат, как показано на скриншоте.

Я пытался создать CTE, но это не сработало. Каков правильный способ?

Спасибо!

Комментарии:

1. Что вы имеете в виду под результатом, подобным изображению? Вы не просто после UNION ALL ? MERGE как операция в SQL, очень отличается; это «upsert» ( UPDATE и INSERT ).

2. Я забыл загрузить изображение с результатом, которого я хочу достичь. Каждый запрос возвращает 3 столбца. Дата, час и сумма. Я хочу получить результат, подобный дате, количеству часов, дате, количеству часов

3. В качестве отдельного примечания: Вредные привычки, от которых нужно отказаться: объявление переменной без (длины)

4. Подумайте: вставьте слово «ОБЪЕДИНЕНИЕ» или «ОБЪЕДИНИТЬ ВСЕ» между двумя запросами и устраните порядок по первому запросу. UNION объединит два набора данных при условии, что выбранные значения одного типа и # удаление дубликатов. UNION ALL дубликаты не будут удалены. ЕСЛИ вам нужно одинаковое количество строк и не добавлять столбцы… UNION Объединит два набора данных.

5. Вы спрашиваете, как объединить два несвязанных набора строк рядом? Вы можете добавить Row_Number столбец к каждому запросу, а затем использовать inner join для сопоставления строк. (Или outer join если вам не гарантировано одинаковое количество строк из каждого запроса.)

Ответ №1:

Во-первых, запрос, который, я думаю, вы ищете, выглядит примерно так. Дата пятницы (@fecha) была удалена в переменную типа DATE. Вместо 2 запросов, 1 для недели и 1 для конкретной пятницы, теперь это 1 запрос. Пятничные продажи распределяются с использованием условной агрегации в новый столбец с именем [FECHA_AMOUNT]. Примечание: это работает, только если переменная @fecha попадает в течение последних 7 дней.

 declare @fecha          date='20201009';

SELECT 
    CONVERT(NVARCHAR, AL.FECHA, 103) AS [DATE], 
    CONVERT(NVARCHAR, AL.HORA, 108) AS [HOUR], 
    SUM(CAST(AL.TOTALNETO AS money)) AS [AMOUNT],
    SUM(case when cast(AL.FECHA as date)=@fecha then CAST(AL.TOTALNETO AS money) 
             else cast(0 as money) end) AS [FECHA_AMOUNT]
FROM 
    ALBVENTACAB AL
WHERE 
    FECHA = CAST(DATEADD(DD, -7, GETDATE()) AS date) 
    AND CONVERT(nvarchar, AL.HORA, 108) BETWEEN (SELECT CONVERT(nvarchar, AL.HORA, 108)) 
    AND CONVERT(nvarchar, GETDATE(), 108)
GROUP BY 
    AL.FECHA, AL.HORA
ORDER BY 
    AL.FECHA;
  

Наконец, как указано в комментариях. При преобразовании всегда полезно использовать длины. Кроме того, тип данных money не считается идеальным. Fwiw