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

以下假设 eqIddate_ 组合是唯一的,正如您在评论中所解释的那样。

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_

如果您有 eqIddate_ 的重复条目,那么这个查询可能会得到您想要的结果(使用 GROUP BYSUM ):

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