2013-04-23 3 views
2

Я не могу найти ни одного вопроса/ответа, который мог бы помочь мне приблизиться к моей цели. У меня есть следующая таблица check code on SQL Fiddle.Как я могу группировать строки и столбцы?

SITENAME RTYPE SEASON CTRSTAT CTRTYPE UNITS STARTDATE WKTYPE INVSTAT 
site1 T2B P  null  null 92  null  FRSA_P Unsold 
site1 T2B Pre null  null 36  null  FRSA_P Unsold 
site1 T2B PRI null  null 173  null  FRSA_P Unsold 
site1 T2B SPE null  null 56  null  FRSA_P Unsold 
site1 T2B P Complete FRSA 2  2013-01-01 FRSA_P Sold 
site1 T2B Pre Complete FRSA 2  2013-01-01 FRSA_P Sold 
site1 T2B PRI Complete FRSA 2  2013-01-01 FRSA_P Sold 
site1 T2B P Complete FRSA 1  2013-03-05 FRSA_P Sold 
site1 T2B P Complete FRSA 3  2014-01-01 FRSA_P Sold 
site1 T2B Pre Complete FRSA 4  2014-01-01 FRSA_P Sold 
site1 T3B P  null  null 69  null  FRSA_P Unsold 
site1 T3B Pre null  null 26  null  FRSA_P Unsold 
site1 T3B PRI null  null 125  null  FRSA_P Unsold 
site1 T3B SPE null  null 40  null  FRSA_P Unsold 
site1 T3B Pre Complete FRSA 2  2013-01-01 FRSA_P Sold 
site1 T3B P Complete FRSA 1  2014-01-01 FRSA_P Sold 
site1 T3B Pre Complete FRSA 2  2014-01-01 FRSA_P Sold 

Затем каким-то образом дойдите до отчета, подобного тому, который изображен на следующем рисунке. Если InvStatus не продан, отчет должен вернуть Unsold, в противном случае CTRSTAT.

Result after grouping by columns and rows with totals

Пожалуйста, не обратить внимание на итоги и итога, изображение из Excel с помощью других данных. Только для того, чтобы иметь образец нужного результата.

EDIT: В финиках столбцов соответствуют полному году, так, например, одна с 2013-03-05 принадлежит к 01/01/2013 колонку. В случае нулевой даты они будут отображаться в прошлом году в этом случае 01/01/2014, но могут быть 2015 o любой период, который был последним.

Я пробовал несколько разных подходов, используя GROUP BY вместе с GROUPING и SETS различных типов, но никто не работал. CUBE и ROLLUP не полезны или, по крайней мере, мне не удалось получить правильный результат. Может быть, просто невозможно, по крайней мере, не налегке.

Вот пример одного из многих запросов, которые я пробовал, пытаясь перекрутить его, чтобы получить что-то вроде отчета, но все равно ничего близкого.

SELECT 
     sitename, rtype, season, ctrstat, ctrtype, SUM(units) 
     ,startdate, invstat 
    FROM tt 
GROUP BY 
GROUPING SETS ((sitename,InvStat,ctrstat) 
       ,(RType,ctrtype,season,startdate) 
       ,() 
      ) 

EDIT: Может должно быть лучше, используя SSRS для решения этой задачи?

+1

Интересная проблема. Это непросто, но это возможно. Прежде чем вы начнете группировку, вам сначала нужно сделать поворот, чтобы извлечь нужные столбцы. Если я получу свободное время в ближайшие несколько часов, я постараюсь дать вам несколько запросов, но не могу обещать. –

+1

Несколько вопросов: как ваш исходный перевод переводится на какие данные столбцов? 2013 или 2014? Специально для непроданных, где это NULL? Куда проходит 2013-03-05? Можете ли вы представить ожидаемые результаты на основе этих точных данных, которые вы опубликовали? –

+0

Спасибо @NenadZivkovic, проверьте новое редактирование. В какой-то момент я подумал о повороте, но я даже не знал, как подойти к этой проблеме. – Yaroslav

ответ

2

Как вы упомянули в своем правлении, я думаю, что это делается, и SSRS - это путь. Вы можете использовать матрицу, чтобы легко создавать отчет, который вы ищете. Используя данные, приведенные в скрипте SQL, вы можете быстро получить что-то, как показано ниже.

Edit: Добавлен суммарные значения enter image description here

enter image description here

+0

Whoaa! Красиво сделано. Я новичок, используя SSRSm, можете ли вы указать какую-то ссылку, где я мог бы найти что-то вроде этого? Это не просто учебник, поскольку он будет охватывать основные вещи, о которых я уже знал. – Yaroslav

+1

Этот отчет создается с помощью группировки по различным полям. Эта страница msdn - хорошее введение в группировку и добавление итогов. Это, в основном, то, что вам нужно: http://msdn.microsoft.com/en-us/library/ms170712.aspx –

+0

Отлично, я нахожусь на этом пути, группы столбцов немного разочаровывают, но подумайте, что я скоро это сделаю. Еще раз спасибо, это был более быстрый способ, поскольку я могу повторно использовать таблицу, которую хранимая процедура возвращает для других отчетов без необходимости ее изменения. – Yaroslav

1

Хотя SSRS, вероятно, это лучший вариант, вот как это можно сделать с помощью SQL запроса. В конце концов, объединение двух может быть лучшим решением.

WITH CTE_Pivot AS 
(
    SELECT 
     sitename 
     ,rtype 
     ,season 
     ,CASE WHEN invstat = 'Sold' AND ctrStat = 'Complete' AND YEAR(startdate)=2013 THEN units ELSE 0 END AS Complete2013 
     ,CASE WHEN invstat = 'Sold' AND ctrStat = 'Complete' AND (YEAR(startdate)=2014 OR startdate IS NULL) THEN units ELSE 0 END AS Complete2014 
     ,CASE WHEN invstat = 'Unsold' AND YEAR(startdate)=2013 THEN units ELSE 0 END AS Unsold2013 
     ,CASE WHEN invstat = 'Unsold' AND (YEAR(startdate)=2014 OR startdate IS NULL) THEN units ELSE 0 END AS Unsold2014 
     ,units AS Total 
    FROM tt 
) 
SELECT sitename,rtype,season 
    ,SUM(Complete2013) AS Complete2013 
    ,SUM(Complete2014) AS Complete2014 
    ,SUM(Unsold2013) AS Unsold2013 
    ,SUM(Unsold2014) AS Unsold2014 
    ,SUM(Total) AS GrandTotal 
FROM CTE_Pivot 
GROUP BY GROUPING SETS ((sitename,rtype,season),(sitename,rtype),sitename) 

SQLFiddle DEMO

Первая часть поворота столбцы. Это довольно простой способ, не используя функцию PIVOT, но объявляя условия для каждого столбца в инструкции CASE. Предполагается, что у вас есть фиксированное количество возможных значений (и столбцов), которые могут быть не идеальными, но создавая dynamic columns require dynamic SQL, что привело бы этот запрос к совершенно новому уровню сложности.

В конце концов, я действительно не думаю, что у вас будут разные значения для CTRSTAT, и я думаю, вы знаете все возможные значения. Годы немного более проблематичны, но все же я думаю, что их не так много. Вы можете пойти с «ЭТОТ Год, ПОСЛЕДНИЙ год, СЛЕДУЮЩИЙ год», чтобы сделать его несколько более пригодным для будущего.

Вторая часть запроса просто группируется с использованием простых наборов группировок. ROLLUP будет таким же.

+0

Протестировано, также работает, у вас есть мой upvote. Я предпочел использовать ответ @Nighty_ таким образом, чтобы я мог повторно использовать хранимую процедуру для других отчетов. Я сохраню этот образец tsql для других нужд, спасибо снова. – Yaroslav

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