2014-07-17 49 views
1
CREATE TABLE #TempTBL 
(
    ID INT IDENTITY(1,1), 
    KC1 varchar(10), 
    KC2 varchar(10), 
    KC3 varchar(10), 
    NC1 int, 
    NC2 money, 
    IsON bit 
) 

INSERT INTO #TempTBL 
SELECT 'ABC','MNO','XYZ',1,1.00,1 
UNION ALL 
SELECT 'ABC','MNO','XYZ',1,1.00,0 
UNION ALL 
SELECT 'ABD','MNO','XYZ',1,1.10,1 
UNION ALL 
SELECT 'ABD','MNO','XYZ',1,1.10,0 
UNION ALL 
SELECT 'ABD','MNO','XYZ',2,1.00,0 
UNION ALL 
SELECT 'ABE','MNO','XYZ',1,1.10,1 

SELECT * FROM #TempTBL 

DROP TABLE #TempTBL 

http://ideone.com/HSLynuT-SQL |计数和排名

我试图找到基于KC1,KC2,以及KC-3(键列)唯一的行号。然后,我试图为每条独特记录推导出IsOn = 1和IsOn = 0的记录数。为了更好地理解,下面是我期望的输出。 (我试图派生RowNum,OnCnt和offCnt字段)。

ID KC1 KC2 KC3 NC1 NC2 IsON RowNum OnCnt OffCnt 
1 ABC MNO XYZ 1 1 1  1  1  1 
2 ABC MNO XYZ 1 1 0  1  1  1 
3 ABD MNO XYZ 1 1.1 1  2  1  2 
4 ABD MNO XYZ 1 1.1 0  2  1  2 
5 ABD MNO XYZ 2 1 0  2  1  2 
6 ABE MNO XYZ 1 1.1 1  3  1  0 

现在你开始说展示你的工作,我只想说,我列出的TBL的部分是一个很大的查询我建立的部分之前。我只是无法想出这三件事的逻辑(如果我们认为OnCnt和OffCnt“相同”,则为2)。

谢谢!

回答

3

RowNum实际上是一个DENSE_RANK(),你可以使用条件骨料计数,(无论是SUM()像下面,或COUNT()):

SELECT * 
     ,RowNum = DENSE_RANK() OVER(ORDER BY KC1,KC2,KC3) 
     ,OnCNT = SUM(CASE WHEN IsON = 1 THEN 1 END) OVER(PARTITION BY KC1,KC2,KC3) 
     ,OffCNT = COALESCE(SUM(CASE WHEN IsON = 0 THEN 1 END) OVER(PARTITION BY KC1,KC2,KC3),0) 
FROM #TempTBL 
+0

GOALLL! thx,这工作!有时间搞清楚实施。 :)谢谢Goat CO。Cheers – 007

+0

调查逻辑的时间。 Dense_rank ...为什么没有分区,为什么按键列排序?对于OffCNT,使用COALESCE是为了处理IsON = 0时没有记录的记录吗?相反,我使用OffCNT = SUM(CASE WHEN ISON = 0 THEN 1 ELSE 0 END)OVER(PARTITION BY KC1,KC2,KC-3)...你预见到任何错误(S)? – 007

+1

排名功能的排名依据顺序,领带被授予同一级别,所以如果你为了你的3键字段,你会得到每这些字段的组合唯一的编号,通过分区将定义一组要为其开始排名例如,如果您想为每个团队对从最好到最差的玩家进行排名,这将非常有用。你对“COALESCE()”是正确的,只是返回'0'而不是'NULL'。你的ELSE将会达到同样的效果。 –

2
Use [Windowing Functions][1] 

SELECT *, 
,DENSE_RANK() OVER(ORDER BY KC1,KC2,KC3) AS Row_Num 
,COUNT(CASE IsON WHEN 1 THEN 1 END) OVER(PARTITION BY KC1,KC2,KC3) AS OnCnt 
,COUNT(CASE IsON WHEN 0 THEN 1 END) OVER(PARTITION BY KC1,KC2,KC3) AS OffCnt 
FROM MyTable 
+0

这里很少有语法错误,额外'ORDER BY'在'DENSE_RANK()'函数,而那些'CASE'语句将在SQL Server中抛出错误(需要一个'THEN'每个'WHEN'),但正确的观念。 –

+0

非常感谢Anon的回应。是的,syntex错误,但想法/逻辑是有道理的。干杯! – 007

1

我给这一个快速反应。

SELECT TBL.*,DENSE_RANK() OVER (ORDER BY TBL.KC1,TBL.KC2,TBL.KC3) RowNum, ONCNT, OFFCNT 
FROM #TempTBL TBL INNER JOIN 
(SELECT KC1,KC2,KC3,SUM(CAST(IsON AS INT)) ONCNT,COUNT(1) - SUM(CAST(IsON AS INT)) OFFCNT FROM #TempTBL GROUP BY KC1,KC2,KC3) 
CNT ON CNT.KC1 = TBL.KC1 AND CNT.KC2 = TBL.KC2 AND CNT.KC3 = TBL.KC3 
+0

感谢classic_vmk。这也有效......有点复杂,但工作。干杯! – 007