2016-03-18 4 views
0

Я застрял на этом какое-то время и не могу для жизни меня понять, почему SQL не тянет через то, что я хочу. Кажется простым, и я знаю, что это просто, но я не могу получить правильные цифры.Функции SQL Sumif/GROUP BY & SUM?

У меня есть код для извлечения данных из объединенных таблиц в нашей базе данных с указанием номеров клиентов, приобретенных продуктов, даты покупки вместе с ценой продукта и количеством этой товарной линейки. Когда я устанавливаю между датами и GROUP по дате, он отлично работает и просматривает всю необходимую информацию.

Я хочу, чтобы GROUP по продукту, суммируя количество продуктов, приобретенных в диапазоне дат для каждого клиента. Когда я пытаюсь суммировать (SIL.ILQTY) сумму над calcualtes это значение ....... Я попробовал Sum с CASE, который также терпит неудачу. У меня есть код ниже и фильтровать записи, чтобы упростить тестирование, поэтому отображается только один продукт и один клиент с 7 датами покупки для этого продукта.

Следующий код показывает записи по дате, которая работает:

SELECT SIH.SICUST, SIL.ILPROD, date(SIL.ILDATE), SIL.ILNET, SIL.ILQTY, 
     SIL.ILQTY*SIL.ILNET, SIH.SICUST || ' ' || rtrim(SIL.ILPROD) || ' ' 
FROM NWBAKERS.BPCSF.IIM IIM, 
    NWBAKERS.BPCSF.SIH SIH, 
    NWBAKERS.BPCSF.SIL SIL 
WHERE SIH.SIINVN = SIL.ILINVN 
    AND IIM.IPROD = SIL.ILPROD 
    AND ((date(SIL.ILDATE) between '02/01/2016' and '02/29/2016')) 
    and SIL.ILWHS ='PR' 
    and SIL.ILQTY > '0' 
    and SIH.SICUST = '40634' 
    and SIL.ILPROD = '81039' 
GROUP BY SIH.SICUST, SIL.ILPROD, date(SIL.ILDATE), SIL.ILQTY, SIL.ILNET 

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

Может ли кто-нибудь указать мне в правильном направлении, пожалуйста ????

Пример изображения данных для выше:

image

данных с датой удалены из группы по и суммы (ILQTY) в операторе отбора:

image2

Desired result for one product by customer

Image shows the added fields for invoice number and order number, giving duplicate lines for date/quantity/invoice as order number are different. The sum of these qty values is what my SQL code was summing previously.

+0

Я удалил тег sql-server, потому что синтаксис явно не является SQL Server. –

+1

Переместите большую часть (дата/обрезка/etc) в производную таблицу, выполните группу на основном уровне. – jarlh

+0

показать пример данных, нужный результат и неправильный вывод, который вы получаете. – Charles

ответ

1

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

SELECT T.SICUST, T.ILPROD, SUM(Quantity) as Num_Products 
FROM 
(
SELECT SIH.SICUST, SIL.ILPROD, SIL.ILNET, MAX(SIL.ILQTY) as Quantity 
FROM NWBAKERS.BPCSF.IIM IIM, 
    NWBAKERS.BPCSF.SIH SIH, 
    NWBAKERS.BPCSF.SIL SIL 
WHERE SIH.SIINVN = SIL.ILINVN 
AND IIM.IPROD = SIL.ILPROD 
AND ((date(SIL.ILDATE) between '02/01/2016' and '02/29/2016')) 
and SIL.ILWHS ='PR' 
and SIL.ILQTY > '0' 
and SIH.SICUST = '40634' 
and SIL.ILPROD = '81039' 
GROUP BY SIH.SICUST, SIL.ILPROD, SIL.ILNET, SIL.ILINVN 
) AS T 
GROUP BY T.SICUST, T.ILPROD 

Проблема была дублирующиеся строки в наших таблицах из имеющих нескольких заказов на ту же счет-фактуре ID, из которого я взял максимальное значение, то сделала сумму этих значений после зачистки даты в группе заявление. Надеюсь, кто-то еще найдет это полезным!

0

Если вы хотите знать, сколько раз ваш Costumer по одной цене QTY/и хотите общее значение, которое вы можете попробовать что-то вроде этого

SELECT SIH.SICUST, SIL.ILPROD, date(SIL.ILDATE), SIL.ILNET, SIL.ILQTY, 
    sum(SIL.ILQTY)*sum(SIL.ILNET) as TotalValue, count(*) as HowManyTimes, 
    SIH.SICUST || ' ' || rtrim(SIL.ILPROD) || ' ' 
    FROM NWBAKERS.BPCSF.IIM IIM, 
     NWBAKERS.BPCSF.SIH SIH, 
     NWBAKERS.BPCSF.SIL SIL 
    WHERE SIH.SIINVN = SIL.ILINVN 
    AND IIM.IPROD = SIL.ILPROD 
    AND ((date(SIL.ILDATE) between '02/01/2016' and '02/29/2016')) 
    and SIL.ILWHS ='PR' 
    and SIL.ILQTY > '0' 
    and SIH.SICUST = '40634' 
    and SIL.ILPROD = '81039' 
    GROUP BY SIH.SICUST, SIL.ILPROD, SIL.ILDATE, SIL.ILQTY, SIL.ILNET 

я не пробовал .. извините

+0

Спасибо, я могу попробовать! – McKenzo