#sql #.net
#sql #.net
Вопрос:
У меня есть следующая таблица, полученная из
SELECT m.MedName as [Medicine],m.MedSellPrice as [RetailPrice],m.MedType as [Type],
m.SoldQuantity as [Sold],m.Quantity as [Available],b.BillAmount as [Total Bill],b.BillDate
FROM BillMedicine AS bm LEFT JOIN
Medicine AS m
ON bm.MedicineID=m.id LEFT JOIN
Bill AS b
ON bm.BilIID = b. ID
но теперь я хочу удалить повторяющиеся строки, кроме суммы «TotalBill».
Ответ №1:
Используйте GROUP BY
:
SELECT
m.MedName AS [Medicine],
m.MedSellPrice AS [RetailPrice],
m.MedType AS [Type],
m.SoldQuantity AS [Sold],
m.Quantity AS [Available],
SUM(b.BillAmount) AS [Total Bill]
FROM BillMedicine AS bm
LEFT JOIN Medicine AS m
ON bm.MedicineID = m.id
LEFT JOIN Bill AS b
ON bm.BilIID = b.ID
GROUP BY
m.MedName,
m.MedSellPrice,
m.MedType,
m.SoldQuantity,
m.Quantity;
Обратите внимание, что для даты выставления счета две выделенные вами «повторяющиеся» записи имеют разные даты. Неясно, какую дату, если таковая имеется, вы хотите сообщить здесь. Я опустил этот столбец.
Комментарии:
1. я понял ваш запрос, но он также выдает исключение
2. Тогда проблема связана с исходным запросом, который вы нам показали, а не с моим ответом.
3. Я применил условие (где b.BillDate<=’somedate’) перед ‘group by’. это запись?
4. @MuamberKhan Да, если вы намерены ограничить только счета, поступающие до определенной даты.
Ответ №2:
ГРУППА ПО — лучший вариант для удаления ДУБЛИКАТОВ ДАТЫ и СУММЫ.
Select Column1,column2....., SUM(Total) as Total From Tablename Group BY column1,column2
Ответ №3:
Похоже, вам нужно большинство (или все) столбцов m
, а затем сумма из другой таблицы. Одним из методов является боковое соединение или коррелированный подзапрос:
SELECT m.*, -- or whatever columns you want,
(SELECT SUM(b.BillAmount)
FROM BillMedicine bm JOIN
Bill b
ON bm.BilIID = b.ID
WHERE bm.MedicineID = m.id
) as [Total Bill]
FROM Medicine m ;
Я предлагаю этот подход по нескольким причинам.
- Это часто более эффективно, чем внешняя агрегация.
- У вас есть
LEFT JOIN
s, но они выглядят неправильно. Я подозреваю, что вы хотите начать сMedicine
таблицы. - Вы включаете дату / время в результаты, но, очевидно, это не подходит при объединении нескольких строк.
Комментарии:
1. Спасибо за ваш ответ, я собираюсь реализовать и посмотреть
2. я попробовал запрос, о котором вы упомянули выше, но он выдает исключение… (Недопустимое имя объекта «Лекарство».)
3. я включаю столбец datetime, потому что мне нужно выбрать те записи, которые соответствуют критериям FromDate и ToDate