Sql 基于其他计算条件的计算字段
我有以下疑问:Sql 基于其他计算条件的计算字段,sql,sql-server,Sql,Sql Server,我有以下疑问: WITH CTE_TblData as( SELECT td.EVENT_ID, td.BSP, td.WIN_LOSE, (SELECT count(*) FROM dbo.tblData td2 WHERE td2.EVENT_ID =td.EVENT_ID) AS [CountRunners], SUM(CASE WHEN td.EVENT_ID = td.EVENT_ID THEN
WITH CTE_TblData as(
SELECT
td.EVENT_ID,
td.BSP,
td.WIN_LOSE,
(SELECT count(*)
FROM dbo.tblData td2
WHERE td2.EVENT_ID =td.EVENT_ID) AS [CountRunners],
SUM(CASE WHEN td.EVENT_ID = td.EVENT_ID THEN 1 END) AS [Total Runners],
SUM(CASE WHEN td.WIN_LOSE = 1 THEN td.BSP END) AS [WinnerPrice],
SUM(CASE WHEN td.WIN_LOSE = 1 THEN 1 END) AS [WinnerCount]
FROM tblData td
WHERE td.EVENT_ID IN(146325086)
GROUP BY td.EVENT_ID, td.BSP, td.WIN_LOSE
)
SELECT td.event_id,
sum(case when td.event_id = td.event_id THEN 1 END) AS [Total Runners],
sum(case when td.WinnerPrice IS NOT NULL THEN td.WinnerPrice END) AS [WinnerPrice],
sum(case when td.WinnerCount IS NOT NULL THEN td.WinnerCount END) AS [WinnerCount],
count(CASE WHEN td.BSP >13 AND td.BSP <=21 AND td.WIN_LOSE = 0 AND td.[Total Runners] >0 AND td.[Total Runners] <=1 THEN td.BSP END) AS Count13to21Runners0to1,
sum(CASE WHEN td.BSP >13 AND td.BSP <=21 AND td.WIN_LOSE = 0 AND td.[Total Runners] >0 AND td.[Total Runners] <=1 THEN td.BSP END) AS Sum13to21Runners0to1,
count(CASE WHEN td.BSP >13 AND td.BSP <=21 AND td.WIN_LOSE = 0 AND td.[Total Runners] >=2 AND td.[Total Runners] <=3 THEN td.BSP END) AS Count13to21Runners2to3,
sum(CASE WHEN td.BSP >13 AND td.BSP <=21 AND td.WIN_LOSE = 0 AND td.[Total Runners] >=2 AND td.[Total Runners] <=3 THEN td.BSP END) AS Sum13to21Runners2to3
FROM CTE_TblData td
WHERE td.EVENT_ID =146325086
GROUP BY td.event_id, [Total Runners]
然而,我似乎有一个错误,在逻辑的情况下,计算每个领域的跑步者。让我解释一下:
开始时的CTE结果为
╔═══════════╦════════╦══════════╦══════════════╦═══════════════╦═════════════╦═════════════╗
║ EVENT_ID ║ BSP ║ WIN_LOSE ║ CountRunners ║ Total Runners ║ WinnerPrice ║ WinnerCount ║
╠═══════════╬════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╣
║ 146325086 ║ 7.09 ║ 0 ║ 13 ║ 1 ║ NULL ║ NULL ║
╠═══════════╬════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╣
║ 146325086 ║ 9.52 ║ 0 ║ 13 ║ 1 ║ NULL ║ NULL ║
╠═══════════╬════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╣
║ 146325086 ║ 9.75 ║ 0 ║ 13 ║ 1 ║ NULL ║ NULL ║
╠═══════════╬════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╣
║ 146325086 ║ 12.11 ║ 0 ║ 13 ║ 1 ║ NULL ║ NULL ║
╠═══════════╬════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╣
║ 146325086 ║ 13.27 ║ 0 ║ 13 ║ 1 ║ NULL ║ NULL ║
╠═══════════╬════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╣
║ 146325086 ║ 17.57 ║ 0 ║ 13 ║ 1 ║ NULL ║ NULL ║
╠═══════════╬════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╣
║ 146325086 ║ 28.25 ║ 0 ║ 13 ║ 1 ║ NULL ║ NULL ║
╠═══════════╬════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╣
║ 146325086 ║ 32.00 ║ 0 ║ 13 ║ 1 ║ NULL ║ NULL ║
╠═══════════╬════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╣
║ 146325086 ║ 67.19 ║ 0 ║ 13 ║ 1 ║ NULL ║ NULL ║
╠═══════════╬════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╣
║ 146325086 ║ 70.00 ║ 0 ║ 13 ║ 1 ║ NULL ║ NULL ║
╠═══════════╬════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╣
║ 146325086 ║ 204.61 ║ 0 ║ 13 ║ 1 ║ NULL ║ NULL ║
╠═══════════╬════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╣
║ 146325086 ║ 210.00 ║ 0 ║ 13 ║ 1 ║ NULL ║ NULL ║
╠═══════════╬════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╣
║ 146325086 ║ 3.09 ║ 1 ║ 13 ║ 1 ║ 3.09 ║ 1 ║
╚═══════════╩════════╩══════════╩══════════════╩═══════════════╩═════════════╩═════════════╝
由此,我使用查询来计算我需要的不同字段。在本例中,“Count13to21Runners2to3”列显示为null,而实际上,我需要的是计算该bsp范围内的“event_id”的数量(该部分有效),并且该数量介于2和3之间
因此,考虑到CTE的结果,我有13个事件id,其中2个包含“win\u lose=0”)和bsp介于13和21之间的条件,我需要字段Count13to21Runners2to3对它们进行计数,并且字段Count13to21Runners0to1将它们标记为空。我认为问题要么在于我在case函数中使用的专栏,要么在于我在为我使用的td.[Total Runners]字段做CTE的方式
因此,为了继续,我需要以某种方式对bsp括号中的2个事件id执行条件,使其在字段Count13to21Runners2to3中成为计数器(因为它们是2),并在Count13to21Runners0to1中标记为null,但我不知道如何执行,我想这个问题在我可以在CTE中添加的专栏中
为清晰起见,请编辑:
我需要这条线:
count(CASE WHEN td.BSP >13 AND td.BSP <=21 AND td.WIN_LOSE = 0 AND td.[Total Runners] >=2 AND td.[Total Runners] <=3 THEN td.BSP END) AS Count13to21Runners2to3,
count(当td.BSP>13且td.BSP=2且td.[Total Runners]13且这是我最后得到的代码:
WITH CTE_TblData as(
SELECT
td.EVENT_ID,
td.MENU_HINT,
td.EVENT_NAME,
td.BSP,
td.EVENT_DT AS Expr1003,
td.WIN_LOSE,
(SELECT count(*) FROM dbo.tblData td2 WHERE td2.EVENT_ID =td.EVENT_ID) AS [CountRunners],
SUM(CASE WHEN td.EVENT_ID = td.EVENT_ID THEN 1 END) AS [Total Runners],
SUM(CASE WHEN td.WIN_LOSE = 1 THEN td.BSP END) AS [WinnerPrice],
SUM(CASE WHEN td.WIN_LOSE = 1 THEN 1 END) AS [WinnerCount],
td.[Race No] AS RaceNo,
replace(LEFT(SUBSTRING(td.EVENT_NAME, CHARINDEX(' ', td.EVENT_NAME) + 1, LEN(td.EVENT_NAME)), CHARINDEX(' ', SUBSTRING(td.EVENT_NAME, CHARINDEX(' ', td.EVENT_NAME) + 2, LEN(td.EVENT_NAME)))),'m','') AS Distance,
REVERSE(LEFT(REVERSE(td.EVENT_NAME), CHARINDEX(' ', REVERSE(td.EVENT_NAME)) - 1)) AS Class,
FORMAT(CONVERT(DATETIME, td.EVENT_DT, 103), 'dddd') AS [Day],
DATEPART(WEEKDAY, CONVERT(DATETIME, td.EVENT_DT, 103)) AS [DayNumber]
FROM tblData td
WHERE td.EVENT_ID IN(145814087)
GROUP BY td.EVENT_ID,
td.MENU_HINT,
td.EVENT_NAME,
td.BSP,
td.EVENT_DT,
td.[Race No],
td.WIN_LOSE
)
SELECT td.event_id, td.MENU_HINT, td.EVENT_NAME, FORMAT (td.Expr1003, 'dd/MM/yyyy ') as Expr1003,
isnull((SELECT count(td2.BSP - CASE WHEN td2.WIN_LOSE =1 THEN 1 end) FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >34 AND td2.BSP <55 HAVING count(td2.BSP) >=4 ),0) AS CountWinnerPrice34to55Runners4to1000,
(SELECT sum(td2.BSP - CASE WHEN td2.WIN_LOSE =0 THEN td2.BSP ELSE 0 end) FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >34 AND td2.BSP <55 HAVING count(td2.BSP) >=4 ) AS SumWinnerPrice34to55Runners4to1000,
isnull((SELECT count(td2.BSP - CASE WHEN td2.WIN_LOSE =0 THEN 1 end) FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >34 AND td2.BSP <55 HAVING count(td2.BSP) >=4 ),0) AS CountWinnerNotPrice34to55Runners4to1000,
(SELECT sum(td2.BSP - CASE WHEN td2.WIN_LOSE =1 THEN td2.BSP ELSE 0 end) FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >34 AND td2.BSP <55 HAVING count(td2.BSP) >=4 ) AS SumWinnerNotPrice34to55Runners4to1000,
isnull((SELECT count(td2.BSP - CASE WHEN td2.WIN_LOSE =1 THEN 1 end) FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >55 AND td2.BSP <89 HAVING count(td2.BSP) IN(0,1) ),0) AS CountWinnerPrice55to89Runners0to1,
(SELECT sum(td2.BSP - CASE WHEN td2.WIN_LOSE =0 THEN td2.BSP ELSE 0 end) FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >55 AND td2.BSP <89 HAVING count(td2.BSP) IN(0,1) ) AS SumWinnerPrice55to89Runners0to1,
isnull((SELECT count(td2.BSP - CASE WHEN td2.WIN_LOSE =0 THEN 1 end) FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >55 AND td2.BSP <89 HAVING count(td2.BSP) IN(0,1) ),0) AS CountWinnerNotPrice55to89Runners0to1,
(SELECT sum(td2.BSP - CASE WHEN td2.WIN_LOSE =1 THEN td2.BSP ELSE 0 end) FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >55 AND td2.BSP <89 HAVING count(td2.BSP) IN(0,1) ) AS SumWinnerNotPrice55to89Runners0to1,
isnull((SELECT count(td2.BSP - CASE WHEN td2.WIN_LOSE =1 THEN 1 end) FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >55 AND td2.BSP <89 HAVING count(td2.BSP) IN(2,3) ),0) AS CountWinnerPrice55to89Runners2to3,
(SELECT sum(td2.BSP - CASE WHEN td2.WIN_LOSE =0 THEN td2.BSP ELSE 0 end) FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >55 AND td2.BSP <89 HAVING count(td2.BSP) IN(2,3) ) AS SumWinnerPrice55to89Runners2to3,
isnull((SELECT count(td2.BSP - CASE WHEN td2.WIN_LOSE =0 THEN 1 end) FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >55 AND td2.BSP <89 HAVING count(td2.BSP) IN(2,3) ),0) AS CountWinnerNotPrice55to89Runners2to3
FROM CTE_TblData td
WHERE td.class not in ('S', 'M', 'Trot', 'Pace')
GROUP BY td.event_id, td.MENU_HINT, td.EVENT_NAME, td.Expr1003, td.RaceNo, td.Distance, td.Class, td.[Day]
Order by td.Expr1003 desc, td.raceno desc
--RETURN 0
查询将返回:
+-----------+---------------------------+--------------+------------+--------------------------------------+------------------------------------+-----------------------------------------+
| event_id | MENU_HINT | EVENT_NAME | Expr1003 | CountWinnerPrice34to55Runners4to1000 | SumWinnerPrice34to55Runners4to1000 | CountWinnerNotPrice34to55Runners4to1000 |
+-----------+---------------------------+--------------+------------+--------------------------------------+------------------------------------+-----------------------------------------+
| 145814087 | AUS / Coff (AUS) 22nd Jul | R7 1415m CL3 | 22/07/2018 | 0 | 0.00 | 4 |
+-----------+---------------------------+--------------+------------+--------------------------------------+------------------------------------+-----------------------------------------+
但是,它的性能非常差。基本上不可能在没有看到您启动数据的情况下知道您在做什么——也不要使用屏幕截图——如果我们想复制数据来编写一些测试和示例代码,我们就不能。@Hogan我如何粘贴而不是屏幕截图,以便易于使用?有什么特殊的网站吗?因为一个表br尝试粘贴时出现EAK。起始数据是CTY。您可以将SSM切换为使用文本输出模式(Ctrl T)。若要返回网格,请使用Ctrld D。注意;只有在重新运行查询时才能看到更改,所以请按Ctrl T然后按F5。谢谢,我这样做了,但是格式并不完美,但我也粘贴了它。@Hogan我修复了表格式,请告诉我您是否需要帮助
+-----------+---------------------------+--------------+-------+------------+----------+--------------+---------------+-------------+-------------+--------+----------+-------+--------+-----------+
| EVENT_ID | MENU_HINT | EVENT_NAME | BSP | Expr1003 | WIN_LOSE | CountRunners | Total Runners | WinnerPrice | WinnerCount | RaceNo | Distance | Class | Day | DayNumber |
+-----------+---------------------------+--------------+-------+------------+----------+--------------+---------------+-------------+-------------+--------+----------+-------+--------+-----------+
| 145814087 | AUS / Coff (AUS) 22nd Jul | R7 1415m CL3 | 4.20 | 2018-07-22 | 1 | 12 | 1 | 4.20 | 1 | 7 | 1415 | CL3 | Sunday | 1 |
+-----------+---------------------------+--------------+-------+------------+----------+--------------+---------------+-------------+-------------+--------+----------+-------+--------+-----------+
| 145814087 | AUS / Coff (AUS) 22nd Jul | R7 1415m CL3 | 4.47 | 2018-07-22 | 0 | 12 | 1 | NULL | NULL | 7 | 1415 | CL3 | Sunday | 1 |
+-----------+---------------------------+--------------+-------+------------+----------+--------------+---------------+-------------+-------------+--------+----------+-------+--------+-----------+
| 145814087 | AUS / Coff (AUS) 22nd Jul | R7 1415m CL3 | 7.80 | 2018-07-22 | 0 | 12 | 1 | NULL | NULL | 7 | 1415 | CL3 | Sunday | 1 |
+-----------+---------------------------+--------------+-------+------------+----------+--------------+---------------+-------------+-------------+--------+----------+-------+--------+-----------+
| 145814087 | AUS / Coff (AUS) 22nd Jul | R7 1415m CL3 | 8.60 | 2018-07-22 | 0 | 12 | 1 | NULL | NULL | 7 | 1415 | CL3 | Sunday | 1 |
+-----------+---------------------------+--------------+-------+------------+----------+--------------+---------------+-------------+-------------+--------+----------+-------+--------+-----------+
| 145814087 | AUS / Coff (AUS) 22nd Jul | R7 1415m CL3 | 10.99 | 2018-07-22 | 0 | 12 | 1 | NULL | NULL | 7 | 1415 | CL3 | Sunday | 1 |
+-----------+---------------------------+--------------+-------+------------+----------+--------------+---------------+-------------+-------------+--------+----------+-------+--------+-----------+
| 145814087 | AUS / Coff (AUS) 22nd Jul | R7 1415m CL3 | 15.95 | 2018-07-22 | 0 | 12 | 1 | NULL | NULL | 7 | 1415 | CL3 | Sunday | 1 |
+-----------+---------------------------+--------------+-------+------------+----------+--------------+---------------+-------------+-------------+--------+----------+-------+--------+-----------+
| 145814087 | AUS / Coff (AUS) 22nd Jul | R7 1415m CL3 | 18.50 | 2018-07-22 | 0 | 12 | 1 | NULL | NULL | 7 | 1415 | CL3 | Sunday | 1 |
+-----------+---------------------------+--------------+-------+------------+----------+--------------+---------------+-------------+-------------+--------+----------+-------+--------+-----------+
| 145814087 | AUS / Coff (AUS) 22nd Jul | R7 1415m CL3 | 30.45 | 2018-07-22 | 0 | 12 | 1 | NULL | NULL | 7 | 1415 | CL3 | Sunday | 1 |
+-----------+---------------------------+--------------+-------+------------+----------+--------------+---------------+-------------+-------------+--------+----------+-------+--------+-----------+
| 145814087 | AUS / Coff (AUS) 22nd Jul | R7 1415m CL3 | 34.20 | 2018-07-22 | 0 | 12 | 1 | NULL | NULL | 7 | 1415 | CL3 | Sunday | 1 |
+-----------+---------------------------+--------------+-------+------------+----------+--------------+---------------+-------------+-------------+--------+----------+-------+--------+-----------+
| 145814087 | AUS / Coff (AUS) 22nd Jul | R7 1415m CL3 | 36.63 | 2018-07-22 | 0 | 12 | 1 | NULL | NULL | 7 | 1415 | CL3 | Sunday | 1 |
+-----------+---------------------------+--------------+-------+------------+----------+--------------+---------------+-------------+-------------+--------+----------+-------+--------+-----------+
| 145814087 | AUS / Coff (AUS) 22nd Jul | R7 1415m CL3 | 40.00 | 2018-07-22 | 0 | 12 | 1 | NULL | NULL | 7 | 1415 | CL3 | Sunday | 1 |
+-----------+---------------------------+--------------+-------+------------+----------+--------------+---------------+-------------+-------------+--------+----------+-------+--------+-----------+
| 145814087 | AUS / Coff (AUS) 22nd Jul | R7 1415m CL3 | 45.55 | 2018-07-22 | 0 | 12 | 1 | NULL | NULL | 7 | 1415 | CL3 | Sunday | 1 |
+-----------+---------------------------+--------------+-------+------------+----------+--------------+---------------+-------------+-------------+--------+----------+-------+--------+-----------+
+-----------+---------------------------+--------------+------------+--------------------------------------+------------------------------------+-----------------------------------------+
| event_id | MENU_HINT | EVENT_NAME | Expr1003 | CountWinnerPrice34to55Runners4to1000 | SumWinnerPrice34to55Runners4to1000 | CountWinnerNotPrice34to55Runners4to1000 |
+-----------+---------------------------+--------------+------------+--------------------------------------+------------------------------------+-----------------------------------------+
| 145814087 | AUS / Coff (AUS) 22nd Jul | R7 1415m CL3 | 22/07/2018 | 0 | 0.00 | 4 |
+-----------+---------------------------+--------------+------------+--------------------------------------+------------------------------------+-----------------------------------------+