2009-12-08 6 views
0

MySQL 5.0.81에서 쿼리를 처리하려고하는데, 지불 된 금액이 아닌 인보이스로 인해 금액이 인출됩니다.MySQL 계정 고령화 보고서

CREATE TABLE `CLMS_invoices` (
    `invoices_id` mediumint(8) NOT NULL auto_increment, 
    `invoices_client_id` mediumint(8) NOT NULL default '0', 
    `invoices_datetimestamp` varchar(50) collate latin1_german2_ci NOT NULL default '', 
    `invoices_description` varchar(100) collate latin1_german2_ci NOT NULL default '', 
    `invoices_discount` decimal(12,2) NOT NULL default '0.00', 
    `invoices_note` text collate latin1_german2_ci NOT NULL, 
    `invoices_status` tinyint(1) NOT NULL default '0', 
    PRIMARY KEY (`invoices_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=5 ; 

CREATE TABLE `CLMS_invoices_payments` (
    `invoices_payments_id` mediumint(8) NOT NULL auto_increment, 
    `invoices_payments_invoice_id` mediumint(8) NOT NULL default '0', 
    `invoices_payments_datetimestamp` varchar(50) collate latin1_german2_ci NOT NULL, 
    `invoices_payments_type` mediumint(8) NOT NULL default '0', 
    `invoices_payments_paid` decimal(12,2) NOT NULL default '0.00', 
    PRIMARY KEY (`invoices_payments_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=10 ; 

CREATE TABLE `CLMS_invoices_products` (
    `invoices_products_id` mediumint(8) NOT NULL auto_increment, 
    `invoices_products_invoice_id` mediumint(8) NOT NULL default '0', 
    `invoices_products_name` varchar(50) collate latin1_german2_ci NOT NULL default '', 
    `invoices_products_price` decimal(12,2) NOT NULL default '0.00', 
    `invoices_products_profit` decimal(12,2) NOT NULL default '0.00', 
    `invoices_products_qty` mediumint(8) NOT NULL default '0', 
    `invoices_products_shipping` decimal(12,2) NOT NULL default '0.00', 
    PRIMARY KEY (`invoices_products_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=12 ; 

나는 다음을 수행 할 쿼리를해야합니다 : CLIENT_ID (invoices_client_id)를 기반으로 풀 송장 지급되지 않습니다 (invoices_status = 0)

그래서 같이 세 개의 테이블이있다.

다음과 같이 노화가 있어야한다 : 최소 30 일 을 31-60일 61~90일

보다 큼 구십일 또한 가을 금액과 관련된 클라이언트 ID를 반환해야합니다

노화 된 그룹으로 송장 할인 - - 송장 제품 원가 금액은 지금까지 유료

송장 제품 비용이

SUM ((invoices_products_price + 다음과 같이 계산됩니다

그룹의 달러 가치는 다음과 같이 계산한다 invoices_products_invoice_id = 가

을 invoices_id invoices_products_profit + invoices_products_shipping) * invoices_products_qty) 0

송장 할인 invoices_discount에 저장됩니다

지금까지 지불 금액 invoices_payments_invoice_id = 이

에게 최종 결과가 보일 것이다 invoices_id

SUM (invoices_payments_paid)과 같이 계산된다

좋아요 :

client_id pastDue1 pastDue2 pastDue3 pastDue4 
1 12.00 0.00 0.00 15.00 
5 2.00 60.00 80.00 32.00 
etc 

누군가이 쿼리를 작성하도록 도와 줄 수 있습니까?

+2

이 열 이름 지정 스타일은 나를 아프게합니다. – cherouvim

+2

도와 드리겠습니다. 컨설팅 서비스에 대한 제안은 어디로 보내야합니까? – JohnFx

+1

@cherouvim : 정규화 된 필드 이름을 가진 3 테이블 조인을 볼 때까지 기다려주십시오 ... – gahooa

답변

0

정확하게 이해하는 경우 - 중요한 문제는 모든 사용자를 다른 연령대로 구분하는 것입니다. 다음과 같이

는 MySQL의에서 IF(condition, then, else) 문으로 수행 할 수 있습니다

는 임시 테이블에 첫 번째 쿼리를 넣어 - 다음과 같이 위의

CREATE TABLE `tmeporary_invoices` 
SELECT invoices.`invoices_client_id`, 
     SUM((products.`invoices_products_price` + products.`invoices_products_profit` + products.`invoices_products_shipping`) * products.`invoices_products_qty`) AS invoice_product_cost, 
     SUM(payments.`invoices_payments_paid`) AS amount_paid_so_far, 
     IF(DATEDIFF(NOW(), invoices.`invoices_datetimestamp`) <= 30 , 'pastDue1', IF(DATEDIFF(NOW(),invoices.`invoices_datetimestamp`) <= 60, 'pastDue2', 'pastDue2')) AS age 
FROM `CLMS_invoices` invoices 
    LEFT JOIN `CLMS_invoices_payments` payments 
      ON payments.`invoices_payments_invoice_id` = invoices.`invoices_id` 
    LEFT JOIN `CLMS_invoices_products` products 
      ON products.`invoices_products_invoice_id` = invoices.`invoices_id` 
WHERE invoices.`invoices_status = 0 

나중에 임시 테이블에서 선택 -

SELECT `invoices_client_id`, 
     SUM(`invoice_product_cost`) AS invoice_product_cost, 
     SUM(`amount_paid_so_far`) AS amount_paid_so_far, 
     SUM(IF(`age` = 'pastDue1',1,0) AS `pastDue1`, 
     SUM(IF(`age` = 'pastDue2',1,0) AS `pastDue2`, 
     SUM(IF(`age` = 'pastDue3',1,0) AS `pastDue3`, 
FROM `tmeporary_invoices` 
GROUP BY `invoices_client_id` 

원하는 결과를 얻는 방법에 대한 일반적인 지침으로 쿼리를 사용해야합니다 (단순히 복사/붙여 넣기를 통해 se 명명 규칙/구문에서 몇 가지 오류가 있기 때문에 나는 그들을 테스트 할 수 없습니다 순간.

행운을 빌어 요!

관련 문제