Суммы SQL в строках вытаскиваются в столбцы? - PullRequest
2 голосов
/ 23 февраля 2009

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

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

SELECT j.dtmInvoicedOn, j.strJobKey, c.strCustName, strTransType, 
     SUM(r.dblTransactionAmount) AS SUM_dblTotalCharge 
     FROM tbljobs AS j
     INNER JOIN tblreceivledger AS r ON j.strJobKey = r.strJobKey 
     INNER JOIN tblcustomers AS c ON j.intCustomerID = c.intCustomerID 
     WHERE c.strCustomerName = 'Acme Runners Inc'
     GROUP BY j.strJobKey, c.strCustName, strTransType
     ORDER BY dtmInvoicedOn, strJobKey;

производит результат, подобный этому, с почти чередующимися суммами дебета и кредита

+----------------+---------------+------------------+--------------------+--------------------+
| dtmInvoicedOn  | strJobKey     | strCustomerName  | strTransactionType | SUM_dblTotalCharge |
+----------------+---------------+------------------+--------------------+--------------------+
| 2008-07-03     | 270876-1      | Acme Runners Inc | credit             |           -5531.52 | 
| 2008-07-11     | 270880-1      | Acme Runners Inc | debit              |            5058.54 | 
| 2008-07-11     | 270880-1      | Acme Runners Inc | credit             |           -5058.54 | 
| 2008-07-18     | 271468-1      | Acme Runners Inc | debit              |            5290.17 | 
| 2008-07-18     | 271468-1      | Acme Runners Inc | credit             |           -5290.17 | 
| 2008-11-07     | 286049-1      | Acme Runners Inc | debit              |            5230.44 | 
| 2008-11-14     | 286051-1      | Acme Runners Inc | debit              |            5375.14 | 
| 2008-11-21     | 286107-1      | Acme Runners Inc | debit              |            5572.33 | 
| 2008-11-28     | 286112-1      | Acme Runners Inc | debit              |            5123.42 | 

так что я хочу, чтобы это выглядело так:

+----------------+---------------+------------------+----------+----------+
| dtmInvoicedOn  | strJobKey     | strCustomerName  |   credit |    debit |
+----------------+---------------+------------------+----------+----------+
| 2008-07-03     | 270876-1      | Acme Runners Inc | -5531.52 |        0 |
| 2008-07-11     | 270880-1      | Acme Runners Inc | -5058.54 |  5058.54 | 
| 2008-07-18     | 271468-1      | Acme Runners Inc | -5290.17 |  5290.17 | 
| 2008-11-07     | 286049-1      | Acme Runners Inc |        0 |  5230.44 | 
| 2008-11-14     | 286051-1      | Acme Runners Inc |        0 |  5375.14 | 
| 2008-11-21     | 286107-1      | Acme Runners Inc |        0 |  5572.33 | 
| 2008-11-28     | 286112-1      | Acme Runners Inc          0 |  5123.42 | 

Обратите внимание, что на сервере в настоящее время работает mysql, но позже он перейдет на postgres и sqlite.

спасибо

Ответы [ 2 ]

7 голосов
/ 23 февраля 2009

это должно сделать работу:

SELECT j.dtmInvoicedOn, j.strJobKey, c.strCustName, strTransType, 
     SUM(CASE WHEN strTransType='credit' THEN r.dblTransactionAmount ELSE 0 END) AS SUM_CREDIT,
     SUM(CASE WHEN strTransType='debit' THEN r.dblTransactionAmount ELSE 0 END) AS SUM_DEBIT
FROM tbljobs AS j
     INNER JOIN tblreceivledger AS r ON j.strJobKey = r.strJobKey 
     INNER JOIN tblcustomers AS c ON j.intCustomerID = c.intCustomerID 
WHERE c.strCustomerName = 'Acme Runners Inc'
GROUP BY j.strJobKey, c.strCustName
ORDER BY dtmInvoicedOn, strJobKey;
3 голосов
/ 23 февраля 2009

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

SELECT j.dtmInvoicedOn
, j.strJobKey
, c.strCustName
, Sum(Case When strTransactionType = 'credit' then r.dblTransactionAmount else 0 end) as credit
, Sum(Case When strTransactionType = 'debit' then r.dblTransactionAmount else 0 end) as debit   
FROM tbljobs AS j     
INNER JOIN tblreceivledger AS r ON j.strJobKey = r.strJobKey      
INNER JOIN tblcustomers AS c ON j.intCustomerID = c.intCustomerID      
WHERE c.strCustomerName = 'Acme Runners Inc'     
GROUP BY j.dtmInvoicedOn
, j.strJobKey
, c.strCustName
ORDER BY dtmInvoicedOn, strJobKey;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...