Я написал следующий SQL-запрос, который дает результат не так, как я хочу. Единственное изменение, которое я хочу, это то, что я не хочу повторять промежуточный итог в каждой строке, что сейчас делает мой запрос:
Вместо этого я хочу, чтобы это было только в последней строке каждого уникального номера bill_number:
Запрос
SELECT
ROW_NUMBER() OVER(
ORDER BY
S.bill_num
) SN,
ROW_NUMBER() OVER(
PARTITION BY S.bill_num
ORDER BY
S.bill_num
) AS [ITEM_NO.],
s.bill_date AS [BILL_DATE],
s.bill_num AS [BILL_NO.],
s.custid AS [CUST_ID],
c.fullname [CUSTOMER],
s.article AS [ARTICLE],
s.price AS [MRP],
s.linetotal AS [TOTAL],
b.billamt as [BILL_TOTAL]
FROM
sold s
LEFT JOIN customers c ON s.custid = c.custid
LEFT JOIN bills b ON S.bill_num = B.bill_num
WHERE
s.bill_date = CONVERT(date, '2020/12/01') AND B.isexpress <> 'P'
ORDER by
S.bill_num
Я думаю, вы поняли, чего я хочу, из приведенных изображений.
Я ищу по всему Интернету, чтобы получить то, что я хочу, но я думаю, что не смог найти правильное ключевое слово, чтобы задать вопрос. ответы приходят для нарастающей суммы, и метод объединения я не могу применить в этом запросе.
Вы можете сделать это с помощью row_number()
и выражения CASE
.
Однако ваш запрос и результат предполагают, что у вас есть несколько строк с одним и тем же s.bill_num
; чтобы получить стабильный результат, вам нужен столбец, который можно использовать для однозначного упорядочения строк с повторяющимися значениями — позвольте мне предположить s.id
:
SELECT
ROW_NUMBER() OVER(ORDER BY S.bill_num, S.id) SN,
ROW_NUMBER() OVER(PARTITION BY S.bill_num ORDER BY S.id) AS [ITEM_NO.],
s.bill_date AS [BILL_DATE],
s.bill_num AS [BILL_NO.],
s.custid AS [CUST_ID],
c.fullname [CUSTOMER],
s.article AS [ARTICLE],
s.price AS [MRP],
s.linetotal AS [TOTAL],
CASE WHEN ROW_NUMBER() OVER(PARTITION BY S.bill_num ORDER BY S.id DESC) = 1 THEN b.billamt END as [BILL_TOTAL]
FROM sold s
LEFT JOIN customers c ON s.custid = c.custid
LEFT JOIN bills b ON S.bill_num = B.bill_num AND B.isexpress <> 'P'
WHERE s.bill_date = CONVERT(date, '2020/12/01')
ORDER by S.bill_num
Обратите внимание, что я переместил условие B.isexpress
из пункта WHERE
в пункт ON
соответствующего LEFT JOIN
; в противном случае это приведет к отфильтровыванию строк, которые не совпадают в bills
, что, похоже, не является вашим намерением.
круто, изложение дела - это ключ, который я искал. большое спасибо, вы спасли мне жизнь. Я просто вставил оператор case в свой существующий запрос и бум.
Я также пробовал с IIF 'IIF (ROW_NUMBER() OVER (PARTITION BY S.bill_num ORDER BY S.bill_num DESC) = 1, b.billamt, 0) as [BILL_TOTAL]', это также дало тот же результат
Я НЕ МОГУ ВСТАВИТЬ ПОЛНЫЙ КОД, ИНАЧЕ Я БЫ ВСТАВИЛ бы ПОЛНЫЙ КОД.
что вы пытались до сих пор достичь желаемого формата?