2014-01-17 6 views
0

Прошу прощения, что этот вопрос не помечен лучше, я не знаю, как описать без примера. Вот чего я пытаюсь достичь.Рекурсивный SQL-подвыбор SQL

Мой Упрощенное данных:

ID ParamName ParamValue 
----------------------- 
1 'Item Code' '100' 
1 'Amount'  '.99' 
2 'Item Code' '555' 
2 'Amount'  '1.99' 
2 'Item Code' '200' 
2 'Amount'  '2.99' 
2 'Item Code' '221' 
2 'Amount'  '.89' 

Мне нужно написать запрос, чтобы вернуть данные в 2 колонки, как, например (если несколько значений для одного ID, предположим, что запись кодов и суммы совпадают в том порядке, они приведены в таблице):

ItemCode Amount 
----------------------- 
'100'  '.99' 
'555'  '1.99' 
'200'  '2.99' 
'221  '.89' 

Это ближайший я могу прийти, но при наличии нескольких кодов товара с тем же ID я не хочу, чтобы сгруппировать их с Максом() и Sum(). Я предполагаю, что существует какая-то рекурсия, но я даже не знаю, с чего начать исследования.

select 
(Select Max(ParamValue) from EventDetail where id = base.id and ParamName = 'Item Code') as ItemCode, 
(Select Sum(ParamValue) from EventDetail where id = base.id and ParamName = 'Amount') as Amount 
from 
(
    select distinct id from EventDetail 
) base 

SQL Скрипки: http://sqlfiddle.com/#!2/09b773/1/0

Спасибо за просмотр!

+1

Там в настоящее время, кажется, не быть способом, чтобы понять, что строка 3 идет с строкой 4, строкой 5 идет со строкой 6 и т. д. Есть ли любой другой столбец в таблице? Если нет, я не знаю, что это разрешимо предсказуемым и детерминированным способом - такие вещи, как добавление индекса, могут изменить способ, которым SQL Server будет определять порядок упорядочивания этих строк. –

+0

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

+1

Вам необходимо исправить модель данных, извините или переставить эту информацию на клиенте, сделав то же предположение, что порядок, в котором находятся строки, не изменится. Не существует способа выразить то, что вы хотите, реляционным способом - таблица представляет собой неупорядоченный пакет строк, по определению. Вы не можете делать какие-либо предположения о «вставленном последовательно» - это не так, как работает реляционная база данных (но вы можете уйти с ней в таких игрушках, как Access). –

ответ

0

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

Так данные будут выглядеть следующим образом:

ID ParamName ParamValue 
----------------------- 
1 'Item Code' '100' 
1 'Amount'  '.99' 
2 'Item Code' '555' 
2 'Amount'  '1.99' 
3 'Item Code' '200' 
3 'Amount'  '2.99' 
4 'Item Code' '221' 
4 'Amount'  '.89' 


WITH uniqueRowID AS 
(
    SELECT DISTINCT ID 
    FROM myTable 
) 
SELECT uniqueRowID, Item.ParamValue as Item, Amount.ParamValue as Amount 
FROM uniqueRowID 
JOIN myTable as Item ON uniqueRowID.ID = Item.ID AND Item.ParamName='Item Code' 
JOIN myTable as Amount ON uniqueRowID.ID = Amount.ID AND Amount.ParamName='Amount' 

Теперь в вашем случае, вам нужно иметь какой-то способ, чтобы заказать детали - вам может понадобиться, чтобы добавить это к Вашему столу - Я позвоню этой колонке myOrder

чтобы получить группировку, как и выше, то сделайте следующее:

WITH item AS 
(
    SELECT ParamValue, 
      ROW_NUMBER() OVER (ORDER BY myOrder) as rn 
    FROM myTable 
    WHERE ParamName = 'Item Code' 
), amount AS 
(
    SELECT ParamValue, 
      ROW_NUMBER() OVER (ORDER BY myOrder) as rn 
    FROM myTable 
    WHERE ParamName = 'Amount' 
) 
SELECT item.ParamValue as ItemCode, amount.ParamValue as Amount 
FROM item 
JOIN amount ON item.rn = amount.rn 
+0

@AaronBertrand - Да, я это увидел и улучшил свой ответ. – Hogan

+0

Спасибо. Я пропустил столбец «InsertedDate». Я считаю, что это будет работать для сортировки. – koolaide

+0

@ koolaide потребовалось полчаса, чтобы обнаружить эту колонку? В следующий раз, пожалуйста, дайте схему вашей таблицы, а не только столбцы, которые, по вашему мнению, могут иметь значение. –

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