我对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
答案 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,