Умножьте значения двух столбцов, суммируйте результат и группируйте результаты в SQL - PullRequest
0 голосов
/ 10 января 2019

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

SELECT MIN(dbo.tblvoucherDetail.fldvoucherno) AS voucherNO, 
dbo.tblvoucherDetail.fldpono, dbo.tblvoucherDetail.fldcategoryno, (
SELECT SUM((dbo.tblvoucherDetail.fldRate * dbo.tblvoucherDetail.fldRqty))) 
AS Total
FROM dbo.tblvoucher INNER JOIN dbo.tblvoucherDetail ON 
dbo.tblvoucher.fldvoucherno = dbo.tblvoucherDetail.fldvoucherno AND 
dbo.tblvoucher.fldvoucherdate = dbo.tblvoucherDetail.fldvoucherdate AND 
dbo.tblvoucher.fldpono = dbo.tblvoucherDetail.fldpono AND 
dbo.tblvoucher.fldpodate = dbo.tblvoucherDetail.fldpodate AND 
dbo.tblvoucher.fldcategoryno = dbo.tblvoucherDetail.fldcategoryno INNER JOIN
dbo.tblitem ON dbo.tblvoucherDetail.flditemid = dbo.tblitem.flditemno AND 
dbo.tblvoucherDetail.fldcategoryno = dbo.tblitem.fldcategory AND
dbo.tblvoucherDetail.flditemsecno = dbo.tblitem.fldsectionno INNER JOIN 
dbo.tblSection ON dbo.tblitem.fldsectionno = dbo.tblSection.fldSectionNo
AND dbo.tblitem.fldcategory = dbo.tblSection.fldCategoryNo
GROUP BY  dbo.tblvoucherDetail.fldpono, 
dbo.tblvoucherDetail.fldcategoryno,
dbo.tblvoucherDetail.fldRate, dbo.tblvoucherDetail.fldRqty, 
dbo.tblitem.flditemname, dbo.tblitem.fldmunit, dbo.tblSection.fldSectionNo,
dbo.tblSection.fldSectionName

Вывод вышеуказанного запроса выглядит так:

enter image description here

Я хочу, чтобы результат был таким:

voucherNO | fldpono | fldcategoryno | Total

1         |  01     | 03            | 572280

3         |  01     | 04            | 56496

2         |  04     | 04            | 1500

Я хочу вычислить сумму общего столбца и сгруппировать их по ваучеруNO

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Научитесь использовать псевдонимы таблиц!

Ваш запрос действительно трудно расшифровать, но я бы начал с простого агрегирования:

SELECT v.fldvoucherno, v.fldpono, v.fldcategoryno,
       SUM(vd.fldRate * vd.fldRqty) AS Total
FROM dbo.tblvoucher v INNER JOIN
     dbo.tblvoucherDetail vd
     ON v.fldvoucherno = vd.fldvoucherno AND 
        v.fldvoucherdate = vd.fldvoucherdate AND 
        v.fldpono = vd.fldpono AND 
        v.fldpodate = vd.fldpodate AND 
        v.fldcategoryno = vd.fldcategoryno INNER JOIN
     dbo.tblitem i
     ON vd.flditemid = i.flditemno AND 
        vd.fldcategoryno = i.fldcategory AND
        vd.flditemsecno = i.fldsectionno INNER JOIN 
     dbo.tblSection s
     ON i.fldsectionno = s.fldSectionNo AND
        i.fldcategory = s.fldCategoryNo
GROUP BY v.fldvoucherno, v.fldpono, v.fldcategoryno;

Ваши JOIN условия также кажутся излишне сложными. Например, я бы ожидал, что fldvoucherno будет достаточно для JOIN между ваучерами и деталями ваучера.

0 голосов
/ 10 января 2019

Попробуйте это:

SELECT Min(dbo.tblvoucherdetail.fldvoucherno) AS voucherNO, 
       dbo.tblvoucherdetail.fldpono, 
       dbo.tblvoucherdetail.fldcategoryno, 
       Sum(dbo.tblvoucherdetail.fldrate * dbo.tblvoucherdetail.fldrqty) AS Total 
FROM   dbo.tblvoucher 
INNER JOIN dbo.tblvoucherdetail 
    ON dbo.tblvoucher.fldvoucherno = dbo.tblvoucherdetail.fldvoucherno 
    AND dbo.tblvoucher.fldvoucherdate = dbo.tblvoucherdetail.fldvoucherdate 
    AND dbo.tblvoucher.fldpono = dbo.tblvoucherdetail.fldpono 
    AND dbo.tblvoucher.fldpodate = dbo.tblvoucherdetail.fldpodate 
    AND dbo.tblvoucher.fldcategoryno = dbo.tblvoucherdetail.fldcategoryno 
INNER JOIN dbo.tblitem 
    ON dbo.tblvoucherdetail.flditemid = dbo.tblitem.flditemno 
    AND dbo.tblvoucherdetail.fldcategoryno =  dbo.tblitem.fldcategory 
    AND dbo.tblvoucherdetail.flditemsecno = dbo.tblitem.fldsectionno 
INNER JOIN dbo.tblsection 
    ON dbo.tblitem.fldsectionno = dbo.tblsection.fldsectionno 
    AND dbo.tblitem.fldcategory = dbo.tblsection.fldcategoryno 
GROUP  BY dbo.tblvoucherdetail.fldpono, 
          dbo.tblvoucherdetail.fldcategoryno;
...