Группировать реестры SQL SERVER используя Distinct и Вступило в брак

Я пробую реализовывать группирование реестров двух подмостков используя следующую консультацию:

  select distinct detrec.iddestino,
--sum(DetRec.NoBulto) as [Número de Bultos], sum(DetRec.Peso) as [Peso],
case when   enrec.OrigenEnvios=detrec.iddestino then sum(DetRec.NoBulto)
end AS NoBultoRecibido,
case when enrec.OrigenEnvios=detrec.iddestino then sum(DetRec.Peso) 
end as Peso,

case when enrec.OrigenEnvios<>detrec.iddestino   then sum(DetRec.Nobulto)
end as NoBultoEnviado,

case when enrec.OrigenEnvios<>detrec.iddestino  then sum(DetRec.Peso)
end as Peso
from Recibos EnRec
inner join RecibosDetalle DetRec on (DetRec.IdRecibo = EnRec.IdRecibo)
inner join Destinos Dest on (Dest.IdDestino = DetRec.IdDestino)
where  convert(char(15),fecharecibo,111) between '2017/01/13' and '2017/01/13' and enrec.idservicio='1'
group by EnRec.IdServicio,DetRec.Iddestino,Enrec.OrigenEnvios

Результат, который я получаю от предыдущей консультации, - следующий: #Figura1 Figura #1

И тот, которого я ищу, получать: #Figura2 introducir la descripción de la imagen aquí

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

1
задан 19.01.2017, 16:24
0 ответов

Достаточно, чтобы ты группировал из-за [detrec].[iddestino] и получи сумму остальных полей. Если бы все еще появилась стоимость 'NULL', ты можешь решать это с IsNull ().

  , sum(case when [enrec].[origenenvios] = [detrec].[iddestino]
        then IsNull([detrec].[nobulto],0) else 0 end) as [nobultorecibido]

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

select
    [detrec].[iddestino]
  , sum(case when [enrec].[origenenvios] = [detrec].[iddestino]
        then [detrec].[nobulto] else 0 end) as [nobultorecibido]
  , sum(case when [enrec].[origenenvios] = [detrec].[iddestino]
        then [detrec].[peso] else 0 end) as [peso]
  , sum(case when [enrec].[origenenvios] <> [detrec].[iddestino]
        then [detrec].[nobulto] else 0 end) as [nobultoenviado]
  , sum(case when [enrec].[origenenvios] <> [detrec].[iddestino]
        then [detrec].[peso] else 0 end) as [peso2]
from
    [recibos] [enrec]
        inner join [recibosdetalle] [detrec]
            on [detrec].[idrecibo] = [enrec].[idrecibo]
        inner join [destinos] [dest]
            on [dest].[iddestino] = [detrec].[iddestino]
where 
    [enrec].[idservicio] = '1'
    and [fecharecibo] >= cast('2017/01/13' as date)
    and [fecharecibo]  < cast('2017/01/14' as date)
group by
  [detrec].[iddestino];
1
ответ дан 03.12.2019, 17:37
  • 1
    Вначале pensé то же самое, но если ты видишь результат, который хочет op, возможно видеть, что не está группируемый исключительно iddestino –  19.01.2017, 16:45
  • 2
    @Lamak я это увидел, но понимаю, что линия в желтом показывает то, что он действительно хочет. –  19.01.2017, 16:48
  • 3
    sí и má s внизу покажи два равных типа стоимости для iddestino. Но хороший, op aceptó твой ответ, а следовательно я предполагаю, что которое posteó вот действительно то, что querí в –  19.01.2017, 16:51
  • 4
    Это был ответ, который нуждался, группировать из-за судеб, нуждался в остальных полях group by, из-за которого а я производился ошибка agregació n, так как, поскольку в CASE он использовал их из-за функции SUM, воплощенной в условном Then. Но будучи функция SUM перед case, уже не необходимо использовать их в Group by. –  19.01.2017, 17:34
  • 5
    @Rotiux Я Понимаю. Но идея о, когда ты показываешь изображение говоря: " я нуждаюсь в этих resultados" тогда deberí схвати проверять, что действительно это результаты, в которых ты нуждаешься –  19.01.2017, 17:49

Не имея данных, чтобы пытаться он трудный, но я думаю, что проблема состоит в том, что ты имеешь sum внутри условия, и когда он недействительный, это еще одна отличная стоимость отделяет это тебе. Я протестировал бы нечто похожее:

sum(
   case when enrec.OrigenEnvios<>detrec.iddestino then DetRec.Nobulto else 0
end) as NoBultoEnviado

Ты был бы должен помещать это во все case.

доказательство и ты рассказываешь мне.

1
ответ дан 03.12.2019, 17:37

Есть несколько проблем с твоей консультацией. Сначала, что совсем, не необходимо, чтобы ты использовал DISTINCT, если уже ты используешь GROUP BY.

С другой стороны, это не ясно, почему ты группируешь из-за 3 колонн, которых только одна не какой-то формы в функции добавления.

Твоя главная проблема, однако, - факт, что ты был бы должен использовать выражение CASE внутри функции добавления (в этом случае, SUM). Когда повторно пишут твою консультацию, он был бы:

SELECT  detrec.iddestino,
        DetRec.iddestino, 
        Enrec.origenenvios,
        SUM(CASE 
              WHEN enrec.origenenvios = detrec.iddestino THEN 
              DetRec.nobulto
            END) AS NoBultoRecibido, 
        SUM(CASE 
              WHEN enrec.origenenvios = detrec.iddestino THEN 
              DetRec.peso
            END) AS Peso, 
        SUM(CASE 
              WHEN enrec.origenenvios <> detrec.iddestino THEN 
              DetRec.nobulto 
            END) AS NoBultoEnviado, 
        SUM(CASE 
              WHEN enrec.origenenvios <> detrec.iddestino THEN 
              DetRec.peso
            END) AS Peso 
FROM dbo.Recibos EnRec 
INNER JOIN dbo.Recibosdetalle DetRec 
       ON DetRec.idrecibo = EnRec.idrecibo
INNER JOIN dbo.Destinos Dest 
       ON Dest.iddestino = DetRec.iddestino
WHERE  fecharecibo BETWEEN '20170113' AND '20170113' 
AND enrec.idservicio = '1' 
GROUP  BY EnRec.idservicio, 
          DetRec.iddestino, 
          Enrec.origenenvios;

Я взял свободу добавления префикса схемы к подмосткам, кроме того, что закончил консультацию с одним ;. Также я удалил CONVERT в колонне fecharecibo, так как как дела, ты не мог бы использовать индекс, если он состоит в том, что он существовал в этой колонне.

0
ответ дан 03.12.2019, 17:37