Объединение SQL Server по группам

#sql #sql-server #tsql

Вопрос:

Я пытаюсь сгруппировать два ВЫБОРА, которые были объединены командой UNION, и сгруппировать по столбцу данных, но я заметил, что столбец данных возвращает два равных значения, когда он должен возвращать только одно, поэтому я подумал о том, чтобы снова сгруппировать это ОБЪЕДИНЕНИЕ по дате, может кто-нибудь мне помочь? Заранее большое вам спасибо

Код:

 SELECT
    Tab_Dados_Producao.E3TimeStamp AS Data,
    ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'PH_07' THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'PH_07',
    ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'PH_08' THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'PH_08',
    ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'PH_09' THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'PH_09',
    ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'MDS' THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'MDS',
    ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'MCCMP' THEN  Tab_Dados_Producao.Valor ELSE 0 END),2) As 'MCCMP',
    ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'MDCMP'THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'MDCMP',
    ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'MCF'THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'MCF',
    ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'MDF'  THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'MDF',
    ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'ESC_04'  THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'ESC_04',
    ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'ESC_RET' THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'ESC_RET'
FROM 
    [E3_CERAL].[dbo].[Tab_Dados_Producao]
WHERE
    MONTH((Tab_Dados_Producao.E3TimeStamp)) = '8' 
    AND DAY((Tab_Dados_Producao.E3TimeStamp)) = '16'
GROUP BY 
    Tab_Dados_Producao.E3TimeStamp

UNION 

SELECT
    Tab_Dados_Escolha.E3TimeStamp AS Data,
    ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'PH_07' THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'PH_07',
    ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'PH_08' THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'PH_08',
    ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'PH_09' THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'PH_09',
    ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'MDS' THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'MDS',
    ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'MCCMP' THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'MCCMP',
    ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'MDCMP'THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'MDCMP',
    ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'MCF'THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'MCF',
    ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'MDF'  THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'MDF',
    ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'ESC_04'  THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'ESC_04',
    ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'ESC_RET' THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'ESC_RET'
FROM 
    [E3_CERAL].[dbo].[Tab_Dados_Escolha]
WHERE
    MONTH((Tab_Dados_Escolha.E3TimeStamp)) = '8' 
    AND DAY((Tab_Dados_Escolha.E3TimeStamp)) = '16'
GROUP BY 
    Tab_Dados_Escolha.E3TimeStamp
 

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

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

1. Похоже, вам нужно сначала объединить данные, затем сгруппировать и агрегировать.

2. Спасибо, вы знаете какой-нибудь пример?

3. В соответствии с руководством по вопросам, пожалуйста, не размещайте изображения кода, данных, сообщений об ошибках и т.д. — Скопируйте или введите текст в вопрос. Пожалуйста, зарезервируйте использование изображений для диаграмм или демонстрации ошибок рендеринга, вещей, которые невозможно точно описать с помощью текста.

Ответ №1:

Конечно, у меня нет возможности проверить следующее, но посмотрите, тот ли это результат, который вы ожидаете — сначала объедините данные из обеих таблиц в CTE, а затем агрегируйте результат:

 with u as (
    select E3TimeStamp as Data, Maquina, Valor
    from dbo.Tab_Dados_Producao
    where Month((E3TimeStamp)) = '8' and Day((E3TimeStamp)) = '16'
    union 
    select E3TimeStamp, Maquina, Metrica 
    from dbo.Tab_Dados_Escolha
    where Month((E3TimeStamp)) = '8' and Day((E3TimeStamp)) = '16'
)

select Data,
  Round(Sum(case when Maquina = 'PH_07'     then Valor else 0 end),2) as PH_07,
  Round(Sum(case when Maquina = 'PH_08'     then Valor else 0 end),2) as PH_08,
  Round(Sum(case when Maquina = 'PH_09'     then Valor else 0 end),2) as PH_09,
  Round(Sum(case when Maquina = 'MDS'       then Valor else 0 end),2) as MDS,
  Round(Sum(case when Maquina = 'MCCMP'     then Valor else 0 end),2) as MCCMP,
  Round(Sum(case when Maquina = 'MDCMP'     then Valor else 0 end),2) as MDCMP,
  Round(Sum(case when Maquina = 'MCF'       then Valor else 0 end),2) as MCF,
  Round(Sum(case when Maquina = 'MDF'       then Valor else 0 end),2) as MDF,
  Round(Sum(case when Maquina = 'ESC_04'    then Valor else 0 end),2) as ESC_04,
  Round(Sum(case when Maquina = 'ESC_RET'   then Valor else 0 end),2) as ESC_RET'
from u
group by data
 

Обратите внимание, что вы не должны использовать имена из 3 частей-вы уже указали базу данных при подключении к SQL Server; также вы не должны цитировать псевдонимы столбцов — если вам нужно использовать специальные символы, например пробелы, или если вы используете зарезервированные слова, вы заключаете имя в [фигурные скобки], но в вашем случае все в порядке.