2013-12-07 3 views
1

Я хочу получить данные из таблиц, где имеется более двух (не менее 2 обязательных) значений для одного клиента: 1) задолженность 2) задолженность. Мне нужно показать эти два значения в соответствии с максимальной датой для каждого клиента в одной строке. Я использую запрос нижеВыберите два значения из двух разных строк для одного NAME

QUERY

SELECT MAX(RECEIPTS.DATENEW) AS DATE, 
    MAX(CASE WHEN PAYMENTS.PAYMENT = 'debt' THEN PAYMENTS.TOTAL END) `TAKEN DEBT`, 
    MAX(CASE WHEN PAYMENTS.PAYMENT = 'debtpaid' THEN PAYMENTS.TOTAL END) `PAID DEBT`, 
    CUSTOMERS.NAME AS CUSTOMER 
FROM RECEIPTS 
INNER JOIN TICKETS ON RECEIPTS.ID = TICKETS.ID 
    INNER JOIN PAYMENTS ON RECEIPTS.ID = PAYMENTS.RECEIPT 
    INNER JOIN CUSTOMERS ON TICKETS.CUSTOMER = CUSTOMERS.ID 
WHERE PAYMENTS.PAYMENT IN('debt', 'debtpaid') 
GROUP BY RECEIPTS.ID 

, которая возвращает результат, как показано ниже, кажется, ближе ...

enter image description here

Но мне нужно как долг и ценности debtpaid быть в одной строке для одного клиента и с их датами (отдельные даты). Необходимые данные что-то вроде ниже изображения

enter image description here

+1

Не могли бы вы сделать http://sqlfiddle.com/ из этого, чтобы мы могли экспериментировать со значениями и запросом? База данных – skiwi

+0

довольно большая и сложная, просто для идеи, как применить это к дате? – Saqib

+0

Включите только те данные, которые подходят для его тестирования, вот как это должно быть сделано. sqlfiddle не позволяет публиковать полные базы данных. – skiwi

ответ

0

Ну, что работал как-то! Только несколько вещей, которые нужно заметить, поскольку я сказал, что для каждого клиента есть две записи, поэтому пришлось группировать КЛИЕНТОМ и применять одно и то же предложение CASE для дат, поэтому просто поместите код на случай, если кто-то может найти его полезным.

SELECT 
    MAX(CASE WHEN PAYMENTS.PAYMENT = 'debt' THEN PAYMENTS.TOTAL END) AS TAKENDEBT, 
    MIN(CASE WHEN PAYMENTS.PAYMENT = 'debtpaid' THEN PAYMENTS.TOTAL END) AS GIVENDEBT, 
    MAX(CASE WHEN PAYMENTS.PAYMENT = 'debt' THEN RECEIPTS.DATENEW END) AS TAKENDATE, 
    MAX(CASE WHEN PAYMENTS.PAYMENT = 'debtpaid' THEN RECEIPTS.DATENEW END) AS GIVENDATE, 
    CASE WHEN PAYMENTS.PAYMENT = 'debt' OR PAYMENTS.PAYMENT = 'debtpaid' THEN CUSTOMERS.NAME END AS CUSTOMER 
FROM RECEIPTS 
    INNER JOIN TICKETS ON RECEIPTS.ID = TICKETS.ID 
    INNER JOIN PAYMENTS ON RECEIPTS.ID = PAYMENTS.RECEIPT 
    INNER JOIN CUSTOMERS ON TICKETS.CUSTOMER = CUSTOMERS.ID 
WHERE 
    (PAYMENTS.PAYMENT = 'debt' 
    OR PAYMENTS.PAYMENT = 'debtpaid') 
GROUP BY CUSTOMER 
ORDER BY CUSTOMER 

Спасибо за все ваши предложения!

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