2014-07-08 144 views
0

我在使用MySQL数据库的旧版经典asp应用程序中使用以下查询生成报表。MySql查询加入

SELECT DISTINCT * 
FROM 
    (SELECT b.rep_year, 
      b.rep_month, 
      sum(x.book_qty)AS salecnt, 
      sum(x.book_qty*x.s_price)AS Tsales 
    FROM report_date b 
    LEFT JOIN sale x ON Month(x.s_Date) = b.rep_month 
    AND year(x.s_Date) = b.rep_year 
    WHERE x.s_date <=curdate() 
    AND x.s_date >'2010-10-31' 
    GROUP BY b.rep_month, 
      b.rep_year)AS bob, 

    (SELECT c.rep_year, 
      c.rep_month, 
      sum(y.gQty) AS Tgift, 
      sum(y.gQty*y.gPrice)AS TGiftSum 
    FROM report_date c 
    LEFT JOIN gift y ON month(y.gDate) = c.rep_month 
    AND year(y.gDate)=c.rep_year 
    WHERE y.gbooktype =1 
    AND y.gdate <=curdate() 
    AND y.gdate>'2010-10-31' 
    GROUP BY c.rep_year, 
      c.rep_month)AS cob, 

    (SELECT d.rep_year, 
      d.rep_month, 
      sum(z.gQty) AS Ttgift, 
      sum(z.gQty*z.gprice)AS TtGiftSum 
    FROM report_date d 
    LEFT JOIN gift z ON month(z.gDate) = d.rep_month 
    AND year(z.gDate)=d.rep_year 
    WHERE z.gbooktype =2 
    AND z.gdate <=curdate() 
    AND z.gDate>'2010-10-31' 
    GROUP BY d.rep_year, 
      d.rep_month)AS dob 
WHERE bob.rep_month = cob.rep_month 
    AND bob.rep_year=cob.rep_year 
    AND bob.rep_year=dob.rep_year 
    AND cob.rep_year=dob.rep_year 
    AND cob.rep_month = dob.rep_month 
GROUP BY bob.rep_year, 
     bob.rep_month 

从三个表:

report_date [rep_id, rep_month, rep_year] 
sale[sale_id,book_id,book_qty,s_date,s_price] 
gift[gift_id,book_id,gQty,gDate,gPrice,gbooktype] 

我已经使用在应用此查询2011年以来和我已经意识到错误,这只是今天。

对于任何特定的年份和月份,如果gbooktype 1和gbooktype 2都没有赠品交易,则在报告摘要中忽略该年份和月份。我将非常感谢任何帮助,以便即使有书籍1或2的赠品交易,或者同时生成该月份和年份的报告。此外,任何查询优化帮助将不胜感激。

回答

0

我建议你建立一个日期列表,然后将其他结果加入到这个列表中。

您可以通过UNIONing固定值并将其添加到起始值来生成日期列表。

这将使你取决于你的REPORT_DATE表包含这大概可以简化为

SELECT month_year.aYear, month_year.aMonth, bob.salecnt, bob.Tsales, cob.Tgift, cob.TGiftSum, dob.Ttgift, dob.TtGiftSum 
FROM 
(
    SELECT YEAR(DATE_ADD(DATE_ADD('2010-10-31', INTERVAL months_add MONTH), INTERVAL years_add YEAR)) as aYear, MONTH(DATE_ADD(DATE_ADD('2010-10-31', INTERVAL months_add MONTH), INTERVAL years_add YEAR)) as aMonth 
    FROM (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11) months_add 
    CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) years_add 
) AS month_year 
LEFT OUTER JOIN 
(
    SELECT b.rep_year, b.rep_month, sum(x.book_qty)as salecnt, sum(x.book_qty*x.s_price)as Tsales 
    FROM report_date b 
    LEFT JOIN sale x 
    ON Month(x.s_Date) = b.rep_month 
    and year(x.s_Date) = b.rep_year 
    WHERE x.s_date <=curdate() 
    and x.s_date >'2010-10-31' 
    GROUP BY b.rep_month, b.rep_year 
)as bob 
ON bob.rep_year = month_year.aYear 
AND bob.rep_month = month_year.aMonth 
LEFT OUTER JOIN 
(
    SELECT c.rep_year, c.rep_month, sum(y.gQty) as Tgift, sum(y.gQty*y.gPrice)as TGiftSum 
    From report_date c 
    LEFT JOIN gift y 
    ON month(y.gDate) = c.rep_month 
    AND year(y.gDate)=c.rep_year 
    WHERE y.gbooktype =1 and y.gdate <=curdate() and y.gdate>'2010-10-31' 
    GROUP BY c.rep_year, c.rep_month 
)as cob 
ON cob.rep_year = month_year.aYear 
AND cob.rep_month = month_year.aMonth 
LEFT OUTER JOIN 
(
    SELECT d.rep_year, d.rep_month, sum(z.gQty) as Ttgift, sum(z.gQty*z.gprice)as TtGiftSum 
    From report_date d 
    LEFT JOIN gift z 
    ON month(z.gDate) = d.rep_month 
    AND year(z.gDate)=d.rep_year 
    WHERE z.gbooktype =2 and z.gdate <=curdate() and z.gDate>'2010-10-31' 
    GROUP BY d.rep_year, d.rep_month 
)as dob 
ON dob.rep_year = month_year.aYear 
AND dob.rep_month = month_year.aMonth 

像这样(未测试): -

SELECT month_year.rep_year, month_year.rep_month, bob.salecnt, bob.Tsales, cob.Tgift, cob.TGiftSum, dob.Ttgift, dob.TtGiftSum 
FROM report_date 
LEFT OUTER JOIN 
(
    SELECT year(x.s_Date) AS rep_year, Month(x.s_Date) AS rep_month, sum(x.book_qty) as salecnt, sum(x.book_qty*x.s_price) as Tsales 
    FROM sale x 
    WHERE x.s_date <= curdate() 
    and x.s_date >'2010-10-31' 
    GROUP BY rep_year, rep_month 
)as bob 
ON bob.rep_year = report_date.rep_year 
AND bob.rep_month = report_date.rep_month 
LEFT OUTER JOIN 
(
    SELECT year(y.s_Date) AS rep_year, Month(y.s_Date) AS rep_month, sum(y.gQty) as Tgift, sum(y.gQty*y.gPrice)as TGiftSum 
    From gift y 
    WHERE y.gbooktype =1 
    and y.gdate <= curdate() 
    and y.gdate>'2010-10-31' 
    GROUP BY rep_year, rep_month 
)as cob 
ON cob.rep_year = report_date.rep_year 
AND cob.rep_month = report_date.rep_month 
LEFT OUTER JOIN 
(
    SELECT year(z.s_Date) AS rep_year, Month(z.s_Date) AS rep_month, sum(z.gQty) as Ttgift, sum(z.gQty*z.gprice)as TtGiftSum 
    From gift z 
    WHERE z.gbooktype =2 
    and z.gdate <= curdate() 
    and z.gDate>'2010-10-31' 
    GROUP BY rep_year, rep_month 
)as dob 
ON dob.rep_year = report_date.rep_year 
AND dob.rep_month = report_date.rep_month 
WHERE CONCAT(month_year.rep_year, month_year.rep_month) > '201010' 
AND CONCAT(month_year.rep_year, month_year.rep_month) <= DATE_FORMAT(CURDATE(), '%Y%m') 

它可能会简化这进一步取决于它包含什么

+0

谢谢@Kickstart我试图运行查询,但它报告找不到一些字段。 report_date表包含从2010年1月1日至2016年12月安排的rep_year(2010年)和rep_month(月,例如2月2日,12月12日12月) – Diin

+0

您可以使用一些示例数据设置SQL提琴,以便我可以进行测试。 – Kickstart

+0

稍微调整了第二个工作。如果没有任何样本数据,您能够提供帮助的速度令我印象深刻 – Diin