T-SQL |计数和排名

时间:2014-07-17 17:04:53

标签: sql sql-server sql-server-2012

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/HSLynu

我正在尝试根据KC1,KC2和KC3(键列)找到唯一的行号。然后,我试图为每个唯一记录派生,有多少记录有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

现在在你开始说明你的工作之前,我只想说我列出的部分内容是我正在构建的一个大查询的一部分。我只是无法为这三件事提出逻辑(如果我们考虑OnCnt和OffCnt"相同"则为2)。

谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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