递归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-是的,我看到了,并改进了我的答案。谢谢。我确实忽略了一个插入的专栏。“我相信这对分类会有用的。”库莱德。找到另一个专栏花了半个小时?下次,请给出表的模式,而不仅仅是您认为可能相关的列。