SQL Server 2014 - 在分组依据后返回具有非零值的行
SQL Server 2014 - returning rows with non-zero values after group-by
数据如下所示:
eqId date_ close_ high low open_ volume bid ask totRtn _rowId
4 2008-01-02 20.660004 21.100098 20.660004 21.100006 3650 20.649994 21.600006 113.229729 1827
4 2008-01-03 22.979996 22.990005 20.710007 21.100006 13200 21.779999 22.990005 125.944735 1828
4 2008-01-04 22.960007 22.979996 22.000000 22.729996 5600 22.100006 22.960007 125.835183 1829
4 2008-01-07 22.509995 22.949997 22.500000 22.699997 19800 22.520004 22.839996 123.368836 1830
4 2008-01-08 22.389999 22.850006 22.389999 22.500000 8500 22.270004 22.759995 122.711183 1831
4 2008-01-09 22.369995 22.949997 22.369995 22.389999 2100 22.300003 22.500000 122.601548 1832
4 2008-01-10 22.550003 22.619995 22.369995 22.369995 3000 22.399994 22.610001 123.588105 1833
4 2008-01-11 22.710007 22.729996 22.550003 22.729996 1400 22.559998 22.750000 124.465027 1834
4 2008-01-14 22.539993 22.750000 22.470001 22.479996 5700 22.529999 22.699997 123.533244 1835
4 2008-01-15 23.028000 23.028000 22.589996 22.750000 9249 22.750000 23.080002 126.207827 1836
4 2008-01-16 22.919998 23.100006 22.660004 23.000000 10600 22.669998 23.080002 125.615908 1837
4 2008-01-17 22.660004 23.149994 22.660004 23.149994 7325 22.660004 22.919998 124.190979 1838
4 2008-01-18 22.770004 23.089996 22.669998 22.949997 9200 22.770004 22.919998 124.793848 1839
4 2008-01-22 22.279999 22.809998 22.250000 22.509995 8900 22.300003 22.669998 122.108314 1840
4 2008-01-23 22.279999 22.889999 22.270004 22.500000 3900 22.300003 22.759995 122.108314 1841
4 2008-01-24 22.669998 22.910004 22.519897 22.520004 11800 22.550003 22.949997 124.245752 1842
4 2008-01-25 22.770004 22.880005 22.570007 22.690002 6700 22.619995 22.820007 124.793848 1843
我想做的是计算日期的总数,对于给定的 eqid,在定义的日期 运行ge(使用 where 语句)中,交易量为零。因此,如果我提供 1 年作为日期 运行ge,并且有 4 天股票根本没有交易,我希望显示 eqid 和 zero_count。
我试过的脚本是:
SELECT eqId
,date_
,volume
,count(nullif(volume,0)) as hasvol
FROM [CRC].[dbo].[eqPrice]
where date_>'2007-12-31' and date_ < '2012-01-01'
group by eqid,date_,volume
order by eqid
但我得到了这个结果:
eqId date_ volume hasvol
4 2008-01-02 00:00:00 3650 1
4 2008-01-03 00:00:00 13200 1
4 2008-01-04 00:00:00 5600 1
4 2008-01-07 00:00:00 19800 1
4 2008-01-08 00:00:00 8500 1
4 2008-01-09 00:00:00 2100 1
4 2008-01-10 00:00:00 3000 1
4 2008-01-11 00:00:00 1400 1
4 2008-01-14 00:00:00 5700 1
4 2008-01-15 00:00:00 9249 1
4 2008-01-16 00:00:00 10600 1
4 2008-01-17 00:00:00 7325 1
4 2008-01-18 00:00:00 9200 1
4 2008-01-22 00:00:00 8900 1
我似乎无法弄清楚获取总天数的语法,只是每天计数(1)。
如有任何帮助,我们将不胜感激
编辑:将 OP 的回复移至此处
我运行这个:
SELECT top 10 eqId,
date_,
CASE WHEN SUM(COALESCE(volume, 0)) = 0 THEN 0 ELSE 1 END AS hasvol
FROM [CRC].[dbo].[eqPrice]
WHERE date_ > '2007-12-31'
AND date_ < '2012-01-01'
GROUP BY eqid, date_
ORDER BY eqid, date_
得到这个:
eqId date_ hasvol
4 2008-01-02 00:00:00 1
4 2008-01-03 00:00:00 1
4 2008-01-04 00:00:00 1
4 2008-01-07 00:00:00 1
4 2008-01-08 00:00:00 1
4 2008-01-09 00:00:00 1
4 2008-01-10 00:00:00 1
4 2008-01-11 00:00:00 1
4 2008-01-14 00:00:00 1
4 2008-01-15 00:00:00 1
所以在整个日期里我仍然没有得到每个 eqid 的一个号码 运行ge :-(
编辑 2
我以为我可以走了,但是,缺少的是整个日期 运行ge 没有零天的任何实例。当 运行ge 中每天报告非零交易量时,我需要将 DayCntWhereVolumeIsZero 显示为 0。抱歉来回。 . .再次感谢
您正在删除计数前的 NULL
。请记住 count(<colname>)
计算非 NULL 值的数量。只要做:
count(volume) as hasvol
或
coalesce(sum(volume), 0) as hasvol
以下假设 eqId
、date_
组合是唯一的,正如您在评论中所解释的那样。
SELECT eqId,
date_,
volume,
CASE WHEN COALESCE(volume, 0) = 0 THEN 0 ELSE 1 END AS hasvol
FROM [CRC].[dbo].[eqPrice]
WHERE date_ > '2007-12-31'
AND date_ < '2012-01-01'
ORDER BY eqid, date_
如果您有 eqId
、date_
的重复条目,那么这个查询可能会得到您想要的结果(使用 GROUP BY
、SUM
):
SELECT eqId,
date_,
CASE WHEN SUM(COALESCE(volume, 0)) = 0 THEN 0 ELSE 1 END AS hasvol
FROM [CRC].[dbo].[eqPrice]
WHERE date_ > '2007-12-31'
AND date_ < '2012-01-01'
GROUP BY eqid, date_
ORDER BY eqid, date_
编辑
重新阅读您的 post 后,听起来您希望每行 eqId
一行,并且对于每一行,您需要天数 volume
' s 值为 0
.
如果这就是您想要的,那么这就是查询:
(编辑以确保即使 none 天的交易量为零,您仍然会得到计数为零的行)
SELECT eqId,
COUNT(CASE WHEN COALESCE(volume, 0) = 0 THEN 'X' END) AS DayCntWhereVolumeIsZero
FROM [CRC].[dbo].[eqPrice]
WHERE date_ > '2007-12-31'
AND date_ < '2012-01-01'
GROUP BY eqid
ORDER BY eqid
数据如下所示:
eqId date_ close_ high low open_ volume bid ask totRtn _rowId
4 2008-01-02 20.660004 21.100098 20.660004 21.100006 3650 20.649994 21.600006 113.229729 1827
4 2008-01-03 22.979996 22.990005 20.710007 21.100006 13200 21.779999 22.990005 125.944735 1828
4 2008-01-04 22.960007 22.979996 22.000000 22.729996 5600 22.100006 22.960007 125.835183 1829
4 2008-01-07 22.509995 22.949997 22.500000 22.699997 19800 22.520004 22.839996 123.368836 1830
4 2008-01-08 22.389999 22.850006 22.389999 22.500000 8500 22.270004 22.759995 122.711183 1831
4 2008-01-09 22.369995 22.949997 22.369995 22.389999 2100 22.300003 22.500000 122.601548 1832
4 2008-01-10 22.550003 22.619995 22.369995 22.369995 3000 22.399994 22.610001 123.588105 1833
4 2008-01-11 22.710007 22.729996 22.550003 22.729996 1400 22.559998 22.750000 124.465027 1834
4 2008-01-14 22.539993 22.750000 22.470001 22.479996 5700 22.529999 22.699997 123.533244 1835
4 2008-01-15 23.028000 23.028000 22.589996 22.750000 9249 22.750000 23.080002 126.207827 1836
4 2008-01-16 22.919998 23.100006 22.660004 23.000000 10600 22.669998 23.080002 125.615908 1837
4 2008-01-17 22.660004 23.149994 22.660004 23.149994 7325 22.660004 22.919998 124.190979 1838
4 2008-01-18 22.770004 23.089996 22.669998 22.949997 9200 22.770004 22.919998 124.793848 1839
4 2008-01-22 22.279999 22.809998 22.250000 22.509995 8900 22.300003 22.669998 122.108314 1840
4 2008-01-23 22.279999 22.889999 22.270004 22.500000 3900 22.300003 22.759995 122.108314 1841
4 2008-01-24 22.669998 22.910004 22.519897 22.520004 11800 22.550003 22.949997 124.245752 1842
4 2008-01-25 22.770004 22.880005 22.570007 22.690002 6700 22.619995 22.820007 124.793848 1843
我想做的是计算日期的总数,对于给定的 eqid,在定义的日期 运行ge(使用 where 语句)中,交易量为零。因此,如果我提供 1 年作为日期 运行ge,并且有 4 天股票根本没有交易,我希望显示 eqid 和 zero_count。
我试过的脚本是:
SELECT eqId
,date_
,volume
,count(nullif(volume,0)) as hasvol
FROM [CRC].[dbo].[eqPrice]
where date_>'2007-12-31' and date_ < '2012-01-01'
group by eqid,date_,volume
order by eqid
但我得到了这个结果:
eqId date_ volume hasvol
4 2008-01-02 00:00:00 3650 1
4 2008-01-03 00:00:00 13200 1
4 2008-01-04 00:00:00 5600 1
4 2008-01-07 00:00:00 19800 1
4 2008-01-08 00:00:00 8500 1
4 2008-01-09 00:00:00 2100 1
4 2008-01-10 00:00:00 3000 1
4 2008-01-11 00:00:00 1400 1
4 2008-01-14 00:00:00 5700 1
4 2008-01-15 00:00:00 9249 1
4 2008-01-16 00:00:00 10600 1
4 2008-01-17 00:00:00 7325 1
4 2008-01-18 00:00:00 9200 1
4 2008-01-22 00:00:00 8900 1
我似乎无法弄清楚获取总天数的语法,只是每天计数(1)。
如有任何帮助,我们将不胜感激
编辑:将 OP 的回复移至此处
我运行这个:
SELECT top 10 eqId,
date_,
CASE WHEN SUM(COALESCE(volume, 0)) = 0 THEN 0 ELSE 1 END AS hasvol
FROM [CRC].[dbo].[eqPrice]
WHERE date_ > '2007-12-31'
AND date_ < '2012-01-01'
GROUP BY eqid, date_
ORDER BY eqid, date_
得到这个:
eqId date_ hasvol
4 2008-01-02 00:00:00 1
4 2008-01-03 00:00:00 1
4 2008-01-04 00:00:00 1
4 2008-01-07 00:00:00 1
4 2008-01-08 00:00:00 1
4 2008-01-09 00:00:00 1
4 2008-01-10 00:00:00 1
4 2008-01-11 00:00:00 1
4 2008-01-14 00:00:00 1
4 2008-01-15 00:00:00 1
所以在整个日期里我仍然没有得到每个 eqid 的一个号码 运行ge :-(
编辑 2
我以为我可以走了,但是,缺少的是整个日期 运行ge 没有零天的任何实例。当 运行ge 中每天报告非零交易量时,我需要将 DayCntWhereVolumeIsZero 显示为 0。抱歉来回。 . .再次感谢
您正在删除计数前的 NULL
。请记住 count(<colname>)
计算非 NULL 值的数量。只要做:
count(volume) as hasvol
或
coalesce(sum(volume), 0) as hasvol
以下假设 eqId
、date_
组合是唯一的,正如您在评论中所解释的那样。
SELECT eqId,
date_,
volume,
CASE WHEN COALESCE(volume, 0) = 0 THEN 0 ELSE 1 END AS hasvol
FROM [CRC].[dbo].[eqPrice]
WHERE date_ > '2007-12-31'
AND date_ < '2012-01-01'
ORDER BY eqid, date_
如果您有 eqId
、date_
的重复条目,那么这个查询可能会得到您想要的结果(使用 GROUP BY
、SUM
):
SELECT eqId,
date_,
CASE WHEN SUM(COALESCE(volume, 0)) = 0 THEN 0 ELSE 1 END AS hasvol
FROM [CRC].[dbo].[eqPrice]
WHERE date_ > '2007-12-31'
AND date_ < '2012-01-01'
GROUP BY eqid, date_
ORDER BY eqid, date_
编辑
重新阅读您的 post 后,听起来您希望每行 eqId
一行,并且对于每一行,您需要天数 volume
' s 值为 0
.
如果这就是您想要的,那么这就是查询:
(编辑以确保即使 none 天的交易量为零,您仍然会得到计数为零的行)
SELECT eqId,
COUNT(CASE WHEN COALESCE(volume, 0) = 0 THEN 'X' END) AS DayCntWhereVolumeIsZero
FROM [CRC].[dbo].[eqPrice]
WHERE date_ > '2007-12-31'
AND date_ < '2012-01-01'
GROUP BY eqid
ORDER BY eqid