Sql server 基于条件的语句划分
我做了一个查询,使用Sql server 基于条件的语句划分,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我做了一个查询,使用RowNumber()对某个表进行分区,然后我只选择行,其中RN=1。然而,我现在看到我当前的查询是不够的,因为分区必须是动态的,基于一个条件 我的查询结果如下表所示,但不应包括某些记录: PROJID ITEMID AMOUNT STARTDATE TAXITEMGROUPID MODELID RN 300.201343.01 4101 9648168.000000000000 201710
RowNumber()
对某个表进行分区
,然后我只选择行,其中RN=1
。然而,我现在看到我当前的查询是不够的,因为分区必须是动态的,基于一个条件
我的查询结果如下表所示,但不应包括某些记录:
PROJID ITEMID AMOUNT STARTDATE TAXITEMGROUPID MODELID RN
300.201343.01 4101 9648168.000000000000 20171004 Hoog Budget 1
300.201343.01 4102 0.000000000000 20171004 Hoog Budget 1
300.201343.01 4201 204541.000000000000 20171004 Hoog Budget 1
300.201343.01 4202 195750.000000000000 20171004 Hoog Budget_21 1
300.201343.01 4205 52933.460000000000 20171004 Hoog Budget 1
300.201343.01 4211 278400.000000000000 20171004 Hoog Budget_21 1
300.201343.01 4212 34800.000000000000 20171004 Hoog Budget 1
300.201343.01 4215 620448.000000000000 20171004 Hoog Budget_21 1
300.201343.01 4304 8400.000000000000 20151030 Geen Budget_12 1 --shouldn't have RN = 1
300.201343.01 4304 8700.000000000000 20171004 Hoog Budget 1
300.201343.01 4305 8700.000000000000 20171004 Hoog Budget 1
300.201343.01 4307 130500.000000000000 20171004 Geen Budget 1
300.201343.01 4307 154728.000000000000 20151030 Laag Budget_12 1 --shouldn't have RN = 1
300.201343.01 4309 41322.310000000000 20150216 Hoog Budget_5 1
例如,当STARTDATE
也相同时,我只希望ITEMID
4304被TAXITEMGROUPID
分区。当STARTDATE
不同时,我只希望它按PROJID
和ITEMID
进行分区。
因此,在后一种情况下,RN不应为1,即金额
=8400
这是我当前使用的查询:
;WITH ApprovedBudget_Sales AS
(
SELECT *
,ROW_NUMBER() OVER (PARTITION BY PROJID, ITEMID, TAXITEMGROUPID ORDER BY STARTDATE DESC) RN
FROM FORECASTSALES
WHERE APPROVED = 1 --AND PROJID = '300.201343.01'
)
SELECT
FORECASTSALES.PROJID
,FORECASTSALES.ITEMID
,FORECASTSALES.SALESQTY AS AMOUNT
,CAST(DATEPART(YYYY,ApprovedBudget_Sales.STARTDATE) AS [CHAR](4))
+ RIGHT('0' + CAST(DATEPART(M,ApprovedBudget_Sales.STARTDATE) AS [VARCHAR](2)),2)
+ RIGHT('0' + CAST(DATEPART(D,ApprovedBudget_Sales.STARTDATE) AS [VARCHAR](2)),2) AS STARTDATE
,FORECASTSALES.TAXITEMGROUPID
,MAX(FORECASTSALES.MODELID) AS MODELID
,RN
FROM FORECASTSALES
INNER JOIN ApprovedBudget_Sales
ON ApprovedBudget_Sales.RECID = FORECASTSALES.RECID
AND ApprovedBudget_Sales.DATAAREAID = FORECASTSALES.DATAAREAID
LEFT JOIN CATEGORYTABLE
ON CATEGORYTABLE.CATEGORYID = FORECASTSALES.ITEMID
AND CATEGORYTABLE.DATAAREAID = FORECASTSALES.DATAAREAID
WHERE ApprovedBudget_Sales.RN = 1 --AND FORECASTSALES.PROJID = '300.201343.01'
GROUP BY
FORECASTSALES.DATAAREAID
,FORECASTSALES.TAXITEMGROUPID
,FORECASTSALES.SALESQTY
,FORECASTSALES.PROJID
,FORECASTSALES.ITEMID
,FORECASTSALES.ACTIVE
,CATEGORYTABLE.CATEGORYNAME
,ApprovedBudget_Sales.RN
,ApprovedBudget_Sales.STARTDATE
ORDER BY FORECASTSALES.PROJID, FORECASTSALES.ITEMID
有什么建议吗
亲切问候,,
Igor我们可以利用样本数据、预期结果以及您当前获得的结果。例如,很难说出你在找什么,因为你的叙述讨论了4303——这根本不在你给我们展示的结果中。对不起,一个打字错误,那一定是4304。我编辑了这篇文章。所以你希望在同一日期发生冲突的项目的行数始终为1?是的,只要它们具有类似的项目ID、项目ID、TAXITEMGROUPID、STARTDATE,然后是分区项目ID、项目ID、TAXITEMGROUPID。如果它们只有一个相似的PROJID、ITEMID、TAXITEMGROUPID,但起始日期不同,那么就划分PROJID、ITEMID。为什么不使用两个ROW_NUMBER()函数呢?