2013-12-12 19 views
0

Я довольно новичок в SQL, и я пытаюсь разобраться в следующей проблеме: я пытаюсь получить список продуктов с разбивкой, чтобы мы могли видеть, сколько из них один был продан каждый годЕжегодно количество продуктов разбивается

У меня есть две таблицы; Заказы (содержащие JobNum и Date) и Products (с полями JobNum, Fig, Fype, Size и Quantity). Из-за продуктов, изготовленных на заказ, продукт является объединением полей fig, type и size. Например: Для того, чтобы получить список всех вариантов продукта, созданных я могу сделать:

SELECT DISTINCT Fig, 
       Type, 
       Size 
FROM Product; 

А чтобы получить список величин для всех продуктов, производимых в течение календарного года этот запрос, кажется, работает: (дата формат «дд-мм-гггг», следовательно, в 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?

Большое спасибо заранее.

EDIT. Могу ли я указать, что Product.Type может быть пустым в некоторых случаях и через несколько лет можно продавать нулевые экземпляры продукта, поэтому в течение этого года соответствующая величина количества может быть пустым или 0.

+0

какая база данных вы используете? MSSQL, MySQL, PostgreSQL, Oracle, DB/2? – bernhardrusch

+0

Его база данных DBASE. Мы собираемся переместить все данные в MSSQL, но этот пока еще не сделал скачка. – Lambdafive

+0

На MSSQL вы можете использовать оператор PIVOT для выполнения того, что хотите. В DBASE я понятия не имею. Насколько велик набор данных? Рассматривали ли вы группировку по годам в дополнение к рис., Типу и размеру, а затем копирование данных в Excel, например, где вы можете легко сворачивать данные по годам по столбцам? – Dan

ответ

0

Хотя я специально не использовали Dbase примерно с 1986 года, я предполагаю, что они осуществили общую 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

Вам необходимо использовать PIVOT для переноса строк в столбцы.

Microsoft ссылку, чтобы прочитать о PIVOT: http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

Для задачи года, есть функция SQL называется YEAR (Дата), который будет вытаскивать только год от заданной даты. Например:

select year('1-Jan-2013') 
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 
Смежные вопросы