每年都要分解产品数量

时间:2013-12-12 10:22:04

标签: sql dbase

我对SQL很陌生,我正试图解决以下问题 - 我试图将产品列表分解,以便我们可以看到每个产品每年销售的数量

我有两张桌子;订单(包含JobNum和Date)和产品(包含JobNum,图,Fype,大小和数量字段)。由于产品是定制的,产品是无花果,类型和尺寸领域的合并。例如:要获取我创建的所有产品变体的列表:

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

3 个答案:

答案 0 :(得分:0)

您需要使用PIVOT将行转置为列。

微软链接阅读PIVOT:http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

对于年度问题,有一个名为YEAR( Date )的SQL函数,该函数仅从给定日期开出年份。例如:

select year('1-Jan-2013')

答案 1 :(得分: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

答案 2 :(得分: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,