2013-12-12 71 views
0

我对SQL相当陌生,我试图让我的头解决以下问题 - 我试图获得一个产品细分清单,以便我们可以看到每个产品的数量一个已经售出,每年每年获取产品数量细分

我有两个表;订单(包含JobNum和Date)和产品(具有JobNum,Fig,Fype,Size和Quantity字段)。由于产品是定制的产品是无花果,类型和尺寸领域的融合。例如:为了得到我所能做创建的所有变型产品的列表:

SELECT DISTINCT Fig, 
       Type, 
       Size 
FROM Product; 

而获得的数量在一个日历年度的所有产品的列表,这个查询似乎工作:(日期是格式'DD-MM-YYYY' 因此LIKE '2002%' 逐年进行筛选)

SELECT product.fig, 
     product.type, 
     product.size, 
     Sum(product.qty) AS Quantity 
FROM orders.dbf 
     INNER JOIN product.dbf 
       ON orders.jobnum = product.jobnum 
WHERE orders.date LIKE '%2002' 
GROUP BY product.fig, 
      product.type, 
      product.size 

这给数据为1年输出是这样的:

Fig Type Size Qty 
AA B  2  1 

我的问题是我怎么能拉出数据获取像这样的输出?

Fig Type Size 2001 2002 2003... 
AA B  2  1  2  4 
BB C  4  4  6  7 

我能想到如何在程序中生成这个,但我想看看是否可以在SQL中执行?

非常感谢提前。

编辑 - 我可以指出,在某些情况下Product.Type可以是空白的,并且在某些年份有可能销售产品的零个实例,因此在那一年相应的数量可能是空白的或0.

+0

您正在使用哪个数据库? MSSQL,MySQL,PostgreSQL,Oracle,DB/2? – bernhardrusch

+0

它是一个DBASE数据库。我们正在将所有数据转移到MSSQL,但这个数据尚未完成。 – Lambdafive

+0

在MSSQL上,您可以使用PIVOT语句来执行您想要的操作。在DBASE上,我不知道。数据集有多大?除了图形,类型和大小之外,您是否考虑过按Year分组,然后将数据复制到Excel中,例如,您可以轻松地在列上逐年转换数据? – Dan

回答

0

尽管自1986年以来我没有专门使用dbase,但我猜测他们已经实现了与其他语言一样的通用IIF()功能。我更习惯于FoxPro/Visual Foxpro的历史,但这里是你需要的基础,如果你使用的是Visual Foxpro OleDB,你应该没问题。

这里发生了什么,在你经历的过程中,小组将根据每个图,类型,大小,没有问题。现在,要创建您的PIVOT,我只是根据订单日期进行总计(IIF())。如果所讨论的订单日期的年份等于相应的年份,则将该数量添加到该列的总数中,否则,总计零值。现在

SELECT 
     p.fig, 
     p.type, 
     p.size, 
     SUM(IIF(YEAR(o.date) = 2002, p.qty, 0)) as P2002Qty, 
     SUM(IIF(YEAR(o.date) = 2003, p.qty, 0)) as P2003Qty, 
     SUM(IIF(YEAR(o.date) = 2004, p.qty, 0)) as P2004Qty, 
     SUM(IIF(YEAR(o.date) = 2005, p.qty, 0)) as P2005Qty, 
     SUM(IIF(YEAR(o.date) = 2006, p.qty, 0)) as P2006Qty, 
     SUM(IIF(YEAR(o.date) = 2007, p.qty, 0)) as P2007Qty, 
     SUM(IIF(YEAR(o.date) = 2008, p.qty, 0)) as P2008Qty, 
     SUM(IIF(YEAR(o.date) = 2009, p.qty, 0)) as P2009Qty, 
     SUM(IIF(YEAR(o.date) = 2010, p.qty, 0)) as P2010Qty, 
     SUM(IIF(YEAR(o.date) = 2011, p.qty, 0)) as P2011Qty, 
     SUM(IIF(YEAR(o.date) = 2012, p.qty, 0)) as P2012Qty, 
     SUM(IIF(YEAR(o.date) = 2013, p.qty, 0)) as P2013Qty 
    from 
     orders o 
     INNER JOIN product p 
      ON o.jobnum = p.jobnum 
    group by 
     p.fix, 
     p.type, 
     p.size 

,一个音符......如果结果不管是什么奇怪的原因,给出了零大多数列,这是因为发动机是根据第一个“试验”记录运行查询预先确定列大小宽在它实际执行之前。如果是这样,那么两个选项来调整...将每一行更改为以下之一

FROM: 
SUM(IIF(YEAR(o.date) = 2002, p.qty, 0)) as P2002Qty, 

TO: (so it FORCES allocated space to 7 digit positions) 
SUM(IIF(YEAR(o.date) = 2002, p.qty, 0000000)) as P2002Qty, 

OR: (so it always uses the qty size, but multiplies by 1 or 0 so it still uses basis of qty column) 
SUM(p.qty * IIF(YEAR(o.date) = 2002, 1, 0)) as P2002Qty, 
0

您可以使用子查询作为列。例如:

SELECT t0.*, (SELECT COUNT(*) FROM t1 WHERE YEAR(date_fld)=2002) AS y2002, (SELECT COUNT(*) FROM t1 WHERE YEAR(date_fld)=2003) AS y2003 FROM t0 
相关问题