SQL-запрос для удаления дублированных данных и получения суммы в одном столбце

#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