递归SQL列子选择

递归SQL列子选择,sql,sql-server-2008,recursion,subquery,Sql,Sql Server 2008,Recursion,Subquery,我很抱歉,这个问题没有更好的标签,我不知道如何描述没有一个例子。以下是我正在努力实现的目标 我的简化数据: 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 'Ite

我很抱歉,这个问题没有更好的标签,我不知道如何描述没有一个例子。以下是我正在努力实现的目标

我的简化数据:

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'
我需要编写一个查询以返回两列中的数据,例如如果单个ID有多个值,则假设项目代码和金额按照它们在表中的顺序匹配:

ItemCode    Amount
-----------------------
'100'      '.99'
'555'      '1.99'
'200'      '2.99'
'221       '.89'
这是我能找到的最接近的,但是当有多个具有相同ID的项目代码时,我不想将它们与Max和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 Fiddle:


谢谢收看

首先让我们来看一个简单的例子,即有某种方法可以将项目代码和项目金额组合在一起

因此,数据如下所示:

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

目前似乎没有办法理解第3行与第4行、第5行与第6行等。表中还有其他列吗?如果没有,我不知道这是否可以用一种可预测和确定的方式来解决-添加索引之类的事情可能会改变SQL Server确定如何对这些行排序的方式。不幸的是,没有其他列将这些行链接在一起。此时,我必须假设它们是按顺序插入的相信我,我也不喜欢这样。您是对的,索引更改可能会完全搞砸。很抱歉,您需要修复数据模型,或者在客户端上转置此信息,并假设检索行的顺序不会更改。没有一种方法可以用关系的方式来表达您想要的内容——根据定义,表是一个无序的行包。您不能对按顺序插入进行任何假设-这不是关系数据库的工作方式,但您可以在Access之类的玩具中侥幸逃脱。@koolaide-不要忽略Aaron和我-此解决方案将不起作用,您将在将来的某个时候看到奇怪的结果。哈!很好,谢谢,他们确实改变了我的数据。现在删除它。@AaronBertrand-是的,我看到了,并改进了我的答案。谢谢。我确实忽略了一个插入的专栏。“我相信这对分类会有用的。”库莱德。找到另一个专栏花了半个小时?下次,请给出表的模式,而不仅仅是您认为可能相关的列。