2015-12-03 2 views
0

Я пытаюсь получить данные из программного обеспечения contability, который с помощью Microsoft SQL Server 2008.Microsoft SQL Server: SUM и LEFT JOIN двойных значений

Я пытаюсь получить общее количество денег и получить поле под названием Numero de Obra (количество работ) из счета в одной строке, проблема заключается в необходимости суммировать некоторые элементы, чтобы получить общее количество, и когда я получу дополнительный номер поля работы, мои данные дублируются.

Это запрос:

SELECT 
    GVA12.FECHA_EMIS AS [Fecha de emisión] , 
    GVA53.T_Comp AS [Tipo comprobante] , 
    GVA53.N_Comp AS [Nro. comprobante] , 
    GVA12.COD_VENDED AS [Cód. vendedor] , 
    CASE GVA12.COD_VENDED WHEN '**' THEN 'CONTADO' ELSE GVA23.NOMBRE_VEN END AS [Nombre Vendedor] , 
    GVA12.COD_CLIENT AS [Cód. cliente] , 
    CASE GVA12.COD_CLIENT WHEN '000000' THEN 'OCASIONAL' ELSE GVA14.RAZON_SOCI END AS [Razón social] , 
    GVA12.COTIZ AS [Cotización] , 
    GVA45.[DESC] as [Num_Obra]], 
    SUM(CASE WHEN GVA12.T_Comp <> 'FAC' and GVA15.Tipo_Comp = 'C' then (-1) ELSE (1) END * GVA53.CANTIDAD) AS [Cantidad] , 
    SUM(CASE WHEN GVA12.T_Comp <> 'FAC' and GVA15.Tipo_Comp = 'C' then (-1) ELSE (1) END *  CASE GVA12.Cotiz WHEN 0 THEN 0 ELSE   CASE 'BIMONCTE'    WHEN 'BIMONCTE' THEN (CASE GVA12.MON_CTE WHEN 1 THEN GVA53.IMP_NETO_P ELSE GVA53. IMP_NETO_P * GVA12.COTIZ END)    WHEN 'BIORIGEN' THEN (CASE GVA12.MON_CTE WHEN 1 THEN GVA53.IMP_NETO_P/GVA12.COTIZ ELSE GVA53.IMP_NETO_P END)    WHEN 'BICOTIZ' THEN(CASE GVA12.MON_CTE WHEN 1 THEN GVA53.IMP_NETO_P/1 ELSE GVA53.IMP_NETO_P * GVA12.COTIZ/1 END)   END  END) AS [Total] 
FROM 
    GVA12 (NOLOCK) 
INNER JOIN 
    GVA53 (NOLOCK) ON GVA53.T_COMP = GVA12.T_COMP AND GVA53.N_COMP = GVA12.N_COMP 
INNER JOIN 
    GVA23 (NOLOCK) ON GVA12.COD_VENDED = GVA23.COD_VENDED 
LEFT JOIN 
    GVA14 (NOLOCK) ON GVA12.COD_CLIENT = GVA14.COD_CLIENT 
LEFT JOIN 
    GVA15 ON GVA15.IDENT_COMP = GVA12.T_COMP 
LEFT JOIN 
    GVA45 (NOLOCK) ON GVA53.COD_ARTICU = 'NºOBRA' AND 
GVA45.N_COMP = GVA53.N_COMP AND GVA45.N_RENGLON = GVA53.N_RENGL_V 
WHERE 
    (GVA53.COD_ARTICU <> 'Art. Ajuste') AND (GVA53.COD_ARTICU <> '') 
    AND (GVA53.RENGL_PADR = 0 OR GVA53.INSUMO_KIT_SEPARADO =1) 
GROUP BY 
    GVA12.FECHA_EMIS , GVA53.T_Comp , GVA53.N_Comp , GVA12.COD_VENDED , CASE GVA12.COD_VENDED WHEN '**' THEN 'CONTADO' ELSE GVA23.NOMBRE_VEN END , GVA12.COD_CLIENT , CASE GVA12.COD_CLIENT WHEN '000000' THEN 'OCASIONAL' ELSE GVA14.RAZON_SOCI END , GVA12.COTIZ,GVA45.[DESC] 

Мой выходной ток:

number_invoce  client   Number_Of_Work Total   
FAC A000500000354 Hospital  NULL    90 
FAC A000500000354 Hospital  346300   0.000000 

Мой ожидаемый выход:

number_invoce  client   Number_Of_Work Total   
A000500000354  Hospital  346300   90 

У меня есть много разных таблиц, большинство из них не связанные с вопросом, поэтому я объясню только те, которые имеют значение:

GVA53: Он есть все строки из счета-фактуры

Например будет

number_invoce COD_ARTICU  AMOUNT N_RENGL_V 
    A000500000354 Wall   $50 1 
    A000500000354 Roof   $40 2 
    A000500000354 number_of_work $0  3 

GVA45: Это есть описание статьи

number_invoce DESC N_RENGL 
    A000500000354  1 
    A000500000354  2 
    A000500000354 346300 3 

В резюме: мне нужно получить сумму из счета-фактуры, мне нужно суммировать элементы, и мне нужно получить поле DESC (описание) из номера позиции, связанного с n_rengl (количество строк) от GV45 до n_rengl_v от GV53 и где COD_ARTIC равно to number_of_w орк. Все работает, но я не понимаю, почему мои данные дублируются.

Большое спасибо

+0

Set [Вредные Привычки пнуть - положить NOLOCK везде] (http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - НЕ РЕКОМЕНДУЕТСЯ *** использовать это везде - совсем наоборот! –

+0

Спасибо, запрос был сгенерирован с помощью инструмента, имеющего программное обеспечение для обеспечения устойчивости. Я удалил все NOLOCK, но у меня все еще такая же проблема. – Matias

ответ

1

Ok одна последняя попытка: P

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

Проблема заключается в группе по GVA45. [DESC] приводит к двум значениям null из-за левых объединений и фактическому значению. Поскольку вам нужны только значения, вам необходимо вернуть систему max и исключить ее из группы.

Это может сделать ...

SELECT 
    GVA12.FECHA_EMIS AS [Fecha de emisión] , 
    GVA53.T_Comp AS [Tipo comprobante] , 
    GVA53.N_Comp AS [Nro. comprobante] , 
    GVA12.COD_VENDED AS [Cód. vendedor] , 
    CASE GVA12.COD_VENDED WHEN '**' THEN 'CONTADO' ELSE GVA23.NOMBRE_VEN END AS [Nombre Vendedor] , 
    GVA12.COD_CLIENT AS [Cód. cliente] , 
    CASE GVA12.COD_CLIENT WHEN '000000' THEN 'OCASIONAL' ELSE GVA14.RAZON_SOCI END AS [Razón social] , 
    GVA12.COTIZ AS [Cotización] , 
    max(GVA45.[DESC]) as [Num_Obra]], 
    SUM(CASE WHEN GVA12.T_Comp <> 'FAC' and GVA15.Tipo_Comp = 'C' then (-1) ELSE (1) END * GVA53.CANTIDAD) AS [Cantidad] , 
    SUM(CASE WHEN GVA12.T_Comp <> 'FAC' and GVA15.Tipo_Comp = 'C' then (-1) ELSE (1) END *  CASE GVA12.Cotiz WHEN 0 THEN 0 ELSE   CASE 'BIMONCTE'    WHEN 'BIMONCTE' THEN (CASE GVA12.MON_CTE WHEN 1 THEN GVA53.IMP_NETO_P ELSE GVA53. IMP_NETO_P * GVA12.COTIZ END)    WHEN 'BIORIGEN' THEN (CASE GVA12.MON_CTE WHEN 1 THEN GVA53.IMP_NETO_P/GVA12.COTIZ ELSE GVA53.IMP_NETO_P END)    WHEN 'BICOTIZ' THEN(CASE GVA12.MON_CTE WHEN 1 THEN GVA53.IMP_NETO_P/1 ELSE GVA53.IMP_NETO_P * GVA12.COTIZ/1 END)   END  END) AS [Total] 
FROM 
    GVA12 (NOLOCK) 
INNER JOIN 
    GVA53 (NOLOCK) ON GVA53.T_COMP = GVA12.T_COMP AND GVA53.N_COMP = GVA12.N_COMP 
INNER JOIN 
    GVA23 (NOLOCK) ON GVA12.COD_VENDED = GVA23.COD_VENDED 
LEFT JOIN 
    GVA14 (NOLOCK) ON GVA12.COD_CLIENT = GVA14.COD_CLIENT 
LEFT JOIN 
    GVA15 ON GVA15.IDENT_COMP = GVA12.T_COMP 
LEFT JOIN 
    GVA45 (NOLOCK) ON GVA53.COD_ARTICU = 'NºOBRA' AND 
GVA45.N_COMP = GVA53.N_COMP AND GVA45.N_RENGLON = GVA53.N_RENGL_V 
WHERE 
    (GVA53.COD_ARTICU <> 'Art. Ajuste') AND (GVA53.COD_ARTICU <> '') 
    AND (GVA53.RENGL_PADR = 0 OR GVA53.INSUMO_KIT_SEPARADO =1) 
GROUP BY 
    GVA12.FECHA_EMIS , GVA53.T_Comp , GVA53.N_Comp , GVA12.COD_VENDED , CASE GVA12.COD_VENDED WHEN '**' THEN 'CONTADO' ELSE GVA23.NOMBRE_VEN END , GVA12.COD_CLIENT , CASE GVA12.COD_CLIENT WHEN '000000' THEN 'OCASIONAL' ELSE GVA14.RAZON_SOCI END , GVA12.COTIZ 
+0

Спасибо, у меня может быть только одно значение для DESC в GVA45, связанное с num_obra. Я попробовал оба варианта, первый из них говорит, что не может найти соединение для GVA53.COD_ARTICU, GVA53.N_COMP , GVA53.N_RENGL_V, соответствующее ЛЕВЫМ ДВИЖЕНИЕМ с GVA45. А вторая показывает синтаксическую ошибку в группе, заканчивающуюся с помощью GVA12.COTIZ) inLine_V (строка 27), я попытался ее исправить, но я не мог – Matias

+0

, но предположение, которое я делал, было ошибочным тогда. и ни один из них не будет работать, даже если я исправлю проблемы синтаксиса.Чтобы решить эту проблему, вам нужно найти, какое соединение вызывает несколько записей в GVA12, GVA53 или GVA15. Одно из этих объединений, вероятно, вызывает существование множества записей, что приводит к искусственному завышению суммы. Нам нужно понять, что между этими таблицами и данными для решения этой проблемы нужно понять. Это, скорее всего, приведет к созданию суммы перед некоторыми дополнительными объединениями или агрегацией записей перед соединением. Возможно, вместо этого вместо предложения where вместо таблицы присоединяется – xQbert

+0

Прошу прощения, я ошибся, когда напишу вопрос, я отредактирую его теперь у меня нет проблемы с итогами, моя сумма в порядке, просто я хочу иметь только одну строку для счета-фактуры с Num_obra, мой текущий вывод - это строка с общим числом 0 и правильная num_obra и вторая строка с правильной суммой (90) и num_obra null – Matias