#sql #left-join
#sql #соединение по левому краю
Вопрос:
Я написал следующий SQL-запрос, который дает результат не так, как я хочу. Единственное изменение, которое я хочу, это то, что я не хочу повторять промежуточный итог в каждой отдельной строке, что и делает мой запрос сейчас:
Вместо этого я хочу, чтобы он был только в последней строке каждого уникального номера счета:
Запрос
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
Я думаю, вы поняли, чего я хочу от приведенных изображений
Комментарии:
1. что вы пытались сделать до сих пор, чтобы достичь желаемого формата?
2. Я ищу по всему Интернету, чтобы получить то, что я хочу, но я думаю, что не смог найти правильное ключевое слово, чтобы задать вопрос. приходят ответы на текущий итог и метод свертки, который я не могу применить в этом запросе.
Ответ №1:
Вы можете сделать это с row_number()
CASE
помощью выражения and .
Однако ваш запрос и результат предполагают, что у вас есть несколько строк, разделяющих одно и то же 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
, что, похоже, не входит в ваши намерения.
Комментарии:
1. потрясающе, заявление по делу — это ключ, который я искал. большое спасибо, вы спасли мне жизнь. Я просто вставил оператор case в свой существующий запрос и бум.
2. Я также попробовал с, IIF ‘IIF(ROW_NUMBER() OVER(РАЗДЕЛЕНИЕ ПО ПОРЯДКУ S.bill_num ПО ПОРЯДКУ S.bill_num DESC) = 1, b.billamt, 0) как [BILL_TOTAL]’ это также дало тот же результат
3. Я НЕ МОГУ ВСТАВИТЬ ПОЛНЫЙ КОД, ИНАЧЕ Я БЫ ВСТАВИЛ ПОЛНЫЙ КОД.