2012-06-10 2 views
2

Я начинаю писать запросы и пытаюсь понять, что лучше всего подходит для этого. Я создал временную таблицу и написал запрос, чтобы получить следующие данные из следующих данных.Форматирование SQL-запроса для отображения по-разному

SELECT Temp.OrderType,Temp.OrderDate,COUNT(*) as prodCount 
FROM Temp 
GROUP BY Temp.OrderType, Temp.OrderDate 
ORDER BY Temp.OrderType; 

РЕЗУЛЬТАТЫ

OrderType OrderDate     prodCount 
1   2012-06-04 00:00:00.000 1 
1   2012-06-06 00:00:00.000 1 
2   2012-06-07 00:00:00.000 2 
3   2012-06-05 00:00:00.000 1 
3   2012-06-06 00:00:00.000 2 
3   2012-06-07 00:00:00.000 1 
7   2012-06-05 00:00:00.000 1 
11   2012-06-07 00:00:00.000 1 

Как я могу идти о, чтобы получить данные для отображения в этом формате, а не с подсчета сумм, идущих по дате? Date1 Date2 и т. Д., 6/04, 6/05, 6/06, 6/07. Любая помощь или руководство приветствуются. Спасибо вам!

OrderType Date1 Date2 Date3 Date4 
1   1    1 
2        2 
3    1  2  1 
4 
7    1 
11      1 

SAMPLE DATA

OrderDate     OrderType 
2012-06-06 00:00:00.000 1 
2012-06-04 00:00:00.000 1 
2012-06-05 00:00:00.000 7 
2012-06-05 00:00:00.000 3 
2012-06-06 00:00:00.000 3 
2012-06-06 00:00:00.000 3 
2012-06-07 00:00:00.000 3 
2012-06-07 00:00:00.000 2 
2012-06-07 00:00:00.000 2 
2012-06-07 00:00:00.000 3 
2012-06-07 00:00:00.000 11 
+1

Какой двигатель db? SQL Server, MySQL, Oracle и т. Д. –

+2

То, что вы ищете, обычно называется запросом «pivot» или «crosstab». Как написать, что зависит от используемой вами базы данных. –

+0

Кроме того, поскольку ваша таблица будет продолжать получать даты (столбцы, если вы создаете запрос по своему усмотрению), я бы порекомендовал вам написать свой запрос с помощью типов заказов в виде столбцов и дат в виде строк. Ваш запрос будет намного проще и будет масштабироваться с вашими данными. – dbrosier

ответ

1

Если DB двигатель MSSQL, попробуйте следующее:

SELECT OrderDate, 
OrderType_1 = SUM(CASE OrderType WHEN 1 THEN 1 ELSE 0 END), 
OrderType_2 = SUM(CASE OrderType WHEN 2 THEN 1 ELSE 0 END), 
OrderType_3 = SUM(CASE OrderType WHEN 3 THEN 1 ELSE 0 END), 
OrderType_4 = SUM(CASE OrderType WHEN 4 THEN 1 ELSE 0 END), 
OrderType_7 = SUM(CASE OrderType WHEN 7 THEN 1 ELSE 0 END), 
OrderType_11= SUM(CASE OrderType WHEN 11 THEN 1 ELSE 0 END) 
FROM Temp 
GROUP BY OrderDate 
ORDER BY OrderDate 
+0

Забыл «закончить» утверждения дела. Oooops. – dbrosier

+1

Ум, да, и ваш запрос должен работать и в любом продукте SQL (или, по крайней мере, в большинстве из них). Только выход должен быть наоборот: даты должны идти как столбцы, типы как строки. Кроме того, похоже, что OP хочет, чтобы имена столбцов (даты) были динамическими (ну, во всяком случае, это мое чтение вопроса). –

1

Пожалуйста, попробуйте этот

DECLARE @sql varchar(4000) 

    SET @sql = 
     ' 
     SELECT * 
     FROM  
     (
      SELECT OrderType,CONVERT(VARCHAR(10),OrderDate,112) AS OrderDate,prodCount 
      FROm t 
     ) st 
     PIVOT 
     (
     SUM(prodCount) 
     FOR OrderDate IN (' 
     + 
     STUFF(
      (
      SELECT ',[' + OrderDate + ']' 
      FROM 
       (SELECT distinct CONVERT(VARCHAR(10),OrderDate,112) AS OrderDate FROM t) a 
      FOR XML PATH('') 
      ),1,1,'') 
     + ') 
     ) as pvt 
     ORDER BY pvt.OrderType 
     ' 

    PRINT @sql 
    EXEC(@sql) 

SQLFiddle link

Смежные вопросы