SQL-запрос Вопрос - PullRequest
       8

SQL-запрос Вопрос

3 голосов
/ 30 января 2011

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

Таблица:

Planned Order
    id  Item    Date
    0   1   2011-01-24
    1   1   2011-01-26
    2   1   2011-01-28
    3   2   2011-01-24
    4   3   2011-01-27

Customer Order
    id  Item    Date
    4   2   2011-01-25
    3   2   2011-01-24
    2   2   2011-01-24
    1   1   2011-01-26
    0   1   2011-01-24

Я пытаюсь создать следующий запрос:

Item  Category          2011-01-24      2011-01-25   2011-01-26   
1     Customer_Order    1               NULL         1      
1     Planned_Order     1               NULL         1
2     Customer_Order    2               NULL         NULL
2     Planned_Order     1               NULL         NULL
3     Planned_Order     NULL            NULL         NULL

Где счет под датой - это сколько раз товар был заказан в этот день.

Возможно ли это даже с помощью исходного кода SQL или это? Я понимаю, что это можно сделать с помощью других языков, таких как Perl, для манипулирования данными, и с помощью множественного доступа к базе данных, но я хотел сделать это напрямую из raw sql.

Я не могу найти команду (raw sql) для преобразования запроса из столбца и преобразования его в строку. Как я запрашиваю даты и создаю столбец для каждой даты, как показано выше.

Ответы [ 2 ]

2 голосов
/ 30 января 2011

В Sql Server (2005/2008) есть оператор, который делает именно то, что вам нужно (PIVOT)

SELECT Item,Category,[2011-01-24], [2011-01-25], [2011-01-26]
FROM
(SELECT Item, 'Planned_Order' Category, Date
 FROM   [Planned Order]
 union all
 SELECT Item, 'Customer_Order', Date
 FROM   [Customer Order]
 ) AS SourceTable
PIVOT
(
COUNT(*)
FOR Date IN ([2011-01-24], [2011-01-25], [2011-01-26])
) AS PivotTable;
1 голос
/ 30 января 2011

Переносимый способ поворота:

select item, 'Customer_Order' Category,
  COUNT(case when Date='2011-01-24' then 1 else 0 end) as `2010-01-24`,
  COUNT(case when Date='2011-01-25' then 1 else 0 end) as `2010-01-25`,
  COUNT(case when Date='2011-01-26' then 1 else 0 end) as `2010-01-26`
from customer_order
GROUP BY item
union all
select item, 'Planned_Order' Category,
  COUNT(case when Date='2011-01-24' then 1 else 0 end) as `2010-01-24`,
  COUNT(case when Date='2011-01-25' then 1 else 0 end) as `2010-01-25`,
  COUNT(case when Date='2011-01-26' then 1 else 0 end) as `2010-01-26`
from planned_order
GROUP BY item
ORDER BY item, Category

Проблема в том, что вам нужно знать все даты, которые вы хотите отобразить заранее.Единственная СУБД (я знаю) для поддержки динамического списка столбцов - это Oracle.Другие СУБД потребуют, чтобы вы генерировали динамический SQL для создания операторов CASE, по одному для каждой отдельной встреченной даты.

Единственная непереносимая часть состоит в том, что из-за использования дат в качестве имен полей вам необходимо

`2010-01-24` backticks here for MySQL
"2010-01-24" or [2010-01-24] for SQL Server
"2010-01-24" for Oracle
etc
...