2016-10-20 5 views
1

Первое сообщение здесь.Корпус в группе По разделу

Нижеприведенный запрос работает ОК и получает мне цифры, которые мне нужны. Проблема в том, что я должен иметь столбец oh.paid в предложении GROUP BY для запуска запроса. Это дает мне два результата за oh.unitname, мне бы это понравилось.

Я искал вокруг и нашел некоторые связанные проблемы, но решения не работали по моему запросу.

Надеюсь, что некоторые дружелюбные души могут указать мне в правильном направлении.

SELECT oh.unitname, 
    oh.CostCode, 
    CASE 
     WHEN oh.Paid = 1 
     THEN 'Kr '+CONVERT(VARCHAR(50), CAST(SUM(oh.paidsum * oh.ExchangeRate) AS MONEY), -1) 
     ELSE 'Kr '+CONVERT(VARCHAR(50), CAST(SUM(oh.totalprice * oh.ExchangeRate) AS MONEY), -1) 
    END AS Price 
    FROM dbo.OrderHead oh 
    WHERE oh.RowDeleted = 0 
    AND oh.UnitName LIKE '%%' 
    AND oh.DateCreated >= '2016-01-01' 
    AND oh.DateCreated < '2016-12-30' 
    AND oh.CostCode = 1 
    GROUP BY oh.UnitName, 
    oh.CostCode, 
    oh.Paid 
    ORDER BY oh.UnitName; 
+0

Вы хотите получить одну или две суммы? – jarlh

+0

У вас есть несколько строк, один с oh.paid = 1 и другими/s с oh.paid <> 1? –

+0

Привет, колонка oh.paid имеет 1 при оплате, а затем 0, если не оплачена. я хотел бы суммировать их, чтобы получить общую оплаченную и неплатежеспособную ... надеюсь, что это имеет смысл. – Tommel

ответ

0

Я думаю, что вы хотите:

SELECT oh.unitname, oh.CostCode, 
     ('Kr ' + 
     CONVERT(VARCHAR(50), CAST(SUM(CASE WHEN oh.PAID = 1 THEN oh.paidsum * oh.ExchangeRate ELSE 0 END) AS MONEY), -1) 
     ) as PaidSum, 
     ('Kr ' + 
     CONVERT(VARCHAR(50), CAST(SUM(CASE WHEN oh.PAID <> 1 THEN oh.paidsum * oh.ExchangeRate ELSE 0 END) AS MONEY), -1) 
     ) as NotPaidSum 
FROM dbo.OrderHead oh 
WHERE oh.RowDeleted = 0 AND 
     oh.UnitName LIKE '%%' AND 
     oh.DateCreated >= '2016-01-01' AND 
     oh.DateCreated < '2016-12-30' 
     oh.CostCode = 1 
GROUP BY oh.UnitName, oh.CostCode, 
ORDER BY oh.UnitName; 

Это разбивает суммы на две колонки. Предполагается, что oh.Paid не является NULL. Если это возможно, легко изменить второе условие.

+0

Спасибо, что посмотрели на это. просто попробовал ваш запрос, но это не то, что мне нужно. Я хочу суммировать «PaidSum» и «NotPaidSum». – Tommel

+0

@Tommel. , , Затем просто держите эту колонку, а не другую. –

+0

Я вижу, как вы неправильно поняли мой комментарий выше. Запрос, который вы мне помогли, создает два значения, мне нужно только суммировать эти два значения. – Tommel

0

Для двух значений, которые нужно преобразовать в один из них, вы хотите использовать их? Если да, попробуйте следующее:

select a.Unitname,a.CostCode, SUM(a.Price) as Price 
from 
(
SELECT oh.unitname, 
oh.CostCode, 
CASE 
    WHEN oh.Paid = 1 
    THEN 'Kr '+CONVERT(VARCHAR(50), CAST(SUM(oh.paidsum * oh.ExchangeRate) AS MONEY), -1) 
    ELSE 'Kr '+CONVERT(VARCHAR(50), CAST(SUM(oh.totalprice * oh.ExchangeRate) AS MONEY), -1) 
END AS Price 
FROM dbo.OrderHead oh 
WHERE oh.RowDeleted = 0 
AND oh.UnitName LIKE '%%' 
AND oh.DateCreated >= '2016-01-01' 
AND oh.DateCreated < '2016-12-30' 
AND oh.CostCode = 1 
) 
GROUP BY a.UnitName, 
a.CostCode 
ORDER BY a.UnitName 

Это позволит вам суммировать оплаченный столбец после первоначальных изменений, выполненных в заявлении case.

Я надеюсь, что это имеет смысл

0

Может быть, потому что для некоторых из ваших oh.unitname и/или oh.costname oh.paid отличается. Таким образом, он будет группироваться для платных = 1 отдельно, а также отдельно

Смежные вопросы