Поворот против хранимой процедуры SQL (или LINQ) - PullRequest
0 голосов
/ 20 марта 2009

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

Кроме того, если бы это можно было сделать с помощью LINQ в LIST, это было бы решением и для меня.

theID     theGroup   theValue
1          2          Red
2          2          Blue
3          2          Green
1          3          10
2          3          24
3          3          30
1          4          1
2          4          2
3          4          3

Группа № 2 означает ВЫБОР, группа № 3 означает СЧЕТ, Группа № 4 означает СОРТ, поэтому я хочу назвать эти столбцы (я понимаю, что это недостаток PIVOT, но это нормально).

ID        CHOICE     COUNT      SORT
1         Red        10     1
2         Blue       24     2
3         Green      30     3

Ответы [ 2 ]

1 голос
/ 20 марта 2009

Вот несколько способов сделать это в памяти с помощью LINQ.

List<SomeClass> source = new List<SomeClass>()
{
  new SomeClass(){ theID = 1, theGroup = 2, theValue="Red"},
  new SomeClass(){ theID = 2, theGroup = 2, theValue="Blue"},
  new SomeClass(){ theID = 3, theGroup = 2, theValue="Green"},
  new SomeClass(){ theID = 1, theGroup = 3, theValue=10},
  new SomeClass(){ theID = 2, theGroup = 3, theValue=24},
  new SomeClass(){ theID = 3, theGroup = 3, theValue=30},
  new SomeClass(){ theID = 1, theGroup = 4, theValue=1},
  new SomeClass(){ theID = 2, theGroup = 4, theValue=2},
  new SomeClass(){ theID = 3, theGroup = 4, theValue=3}
};

//hierarchical structure
var result1 = source.GroupBy(item => item.theID)
  .Select(g => new {
    theID = g.Key,
    theValues = g
      .OrderBy(item => item.theGroup)
      .Select(item => item.theValue)
      .ToList()
  }).ToList();


//holds some names for the next step.
Dictionary<int, string> attributeNames = new Dictionary<int,string>();
attributeNames.Add(2, "CHOICE");
attributeNames.Add(3, "COUNT");
attributeNames.Add(4, "SORT");
//xml structure
var result2 = source
  .GroupBy(item => item.theID)
  .Select(g => new XElement("Row",
    new XAttribute("ID", g.Key),
    g.Select(item => new XAttribute(attributeNames[item.theGroup], item.theValue))
  ));
1 голос
/ 20 марта 2009

Это сработало для меня и должно работать в SP:

SELECT  theID AS ID
       ,[2] AS CHOICE
       ,[3] AS COUNT
       ,[4] AS SORT
FROM    so_666934 PIVOT ( MAX(theValue) FOR theGroup IN ([2], [3], [4]) ) AS pvt

Существуют приемы, которые вы можете сделать с динамическим SQL для обработки различных групп с течением времени, а также вы можете поворачивать имена, эффективно заменяя группу на имя перед PIVOT.

...