#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