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
我正在尝试根据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)。
谢谢!
答案 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