SQL Server: использование уникального ключевого слова в SQL Server Запрос извлекает неверные данные - PullRequest
0 голосов
/ 20 февраля 2011

У меня есть одна таблица со следующими столбцами.

ID   Amount
1      300
2      400
3      500
1      300 
2      400
3      500

Соответствующим идентификаторам является столбец суммы.

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

Но вот подвох;

Скажите, если ID

ID   Amount
1      300
2      400
3      500
4      400 

и значения 300, 400, 500 и 400. Следовательно, итоговое значение должно быть 1600, но, поскольку я использовал ключевое слово DISTINCT для case1, итоговое значение составляет 1200.

Как мне написать свой SQL-запрос, чтобы оба случая были удовлетворены?

К вашему сведению, мой SQL-запрос - это не просто суммирование, он также включает отношения с другими таблицами, и затем, используя некоторую формулу, я собираю данные.

Спасибо

ОБНОВЛЕНО: SQL-запрос ДОБАВЛЕН

Select distinct
  (
    (
      select sum( fees)
      from (
        select distinct billdetail.fees
        from billdetail
          join payment on billdetail.billdetailid = payment.billdetailid
        where billdetail.patientid=@patientid
      ) as temp
    )
    -
    (
      Select SUM (Payment.PlanPaid)
           + SUM (Payment.PatPaid)
           + SUM (Payment.WriteOff1)
           + SUM (Payment.WriteOff2)
      from  BillDetail
        left outer join Payment on BillDetail.BillDetailID = Payment.BillDetailID
      where BillDetail.PatientID = @patientid
    )
  )
from BillDetail
where PatientID = @patientid

Ответы [ 3 ]

2 голосов
/ 20 февраля 2011

Используя исходный пример, вы можете правильно рассчитать сумму, если при выборе отдельных строк вы предоставляете значение суммы с соответствующим идентификатором. Таким образом, вы будете выбирать строки с одинаковыми суммами, но не с точными дубликатами.

SELECT SUM(Amount)
FROM (
  SELECT DISTINCT
    ID,
    Amount
  FROM YourTable
) s

В добавленном запросе я думаю, что вам нужно изменить этот поднабор:

select distinct billdetail.fees
from billdetail
  join payment on billdetail.billdetailid = payment.billdetailid
where billdetail.patientid=@patientid

как это:

select distinct billdetail.ID, billdetail.fees
from billdetail
  join payment on billdetail.billdetailid = payment.billdetailid
where billdetail.patientid=@patientid

То есть, добавляя billdetail.ID, вы предоставляете необходимый уровень различия, поэтому итоговая сумма должна быть правильной.

0 голосов
/ 20 февраля 2011

Попробуйте это (не проверено, но обратите внимание на "SUM (DISTINCT ...)")

SELECT SUM(DISTINCT  billdetail.fees) - SUM (Payment.PlanPaid) + SUM (Payment.PatPaid) + SUM (Payment.WriteOff1) + SUM (Payment.WriteOff2)
FROM  BillDetail
LEFT OUTER JOIN Payment
ON BillDetail.BillDetailID = Payment.BillDetailID
WHERE BillDetail.PatientID = @patientid ;
0 голосов
/ 20 февраля 2011

Пожалуйста, попробуйте правильно отформатировать запросы для легкого понимания.

Select distinct ((
    select sum( fees) 
    from (
            select distinct  billdetail.fees 
            from billdetail 
            join payment on billdetail.billdetailid = payment.billdetailid 
            where billdetail.patientid=@patientid) 
        as temp)
       -
    (Select SUM (Payment.PlanPaid) + SUM (Payment.PatPaid) + SUM (Payment.WriteOff1) + SUM (Payment.WriteOff2) 
    from  BillDetail 
    left outer join Payment on BillDetail.BillDetailID = Payment.BillDetailID 
    where BillDetail.PatientID = @patientid)
) 
from BillDetail
where PatientID = @patientid

Я собираюсь предположить, что вы просто хотели отличить комиссионные от биллдейла от суммы платежных записей. Странно использовать [inner] JOIN в первой части для сборов и LEFT для платежей (когда справа находится источник значений).

Select sum(f) from
(
Select
        fees
       -
        isnull((Select isnull(SUM (Payment.PlanPaid),0) +
                isnull(SUM (Payment.PatPaid),0) + 
                isnull(SUM (Payment.WriteOff1),0) +
                isnull(SUM (Payment.WriteOff2),0)
        from  Payment 
        where BillDetail.BillDetailID = Payment.BillDetailID),0) f
from BillDetail
where PatientID = @patientid
) X
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...