计算一个数字出现的次数

Pri*_*ton 1 sql t-sql sql-server-2008

我想从我的表中计算每个数字的所有可能组合.

我希望我的查询返回这样的内容:

Number (Value)     Count
       1            39
       2            450
       3            41
Run Code Online (Sandbox Code Playgroud)

我的表看起来像这样:

在此输入图像描述

当我运行以下查询时:

SELECT *
FROM dbo.LottoDraws ld
JOIN dbo.CustomerSelections cs
ON ld.draw_date = cs.draw_date

CROSS APPLY(
  SELECT COUNT(1) correct_count
  FROM (VALUES(cs.val1),(cs.val2),(cs.val3),(cs.val4),(cs.val5),(cs.val6))csv(val)
  JOIN (VALUES(ld.draw1),(ld.draw2),(ld.draw3),(ld.draw4),(ld.draw5),(ld.draw6))ldd(draw)
  ON csv.val = ldd.draw WHERE ld.draw_date = '2013-07-05'
)CC
ORDER BY correct_count desc
Run Code Online (Sandbox Code Playgroud)

我得到这样的东西:

在此输入图像描述

Gor*_*off 5

我提供这种解决方案,因为它unpivot通常比一系列union alls 表现更好.原因是每个都union all可以导致全表扫描,而unpivot它可以通过单次扫描完成.

所以,你可以写下你想要的东西:

select val, count(*)
from (select pk, val
      from test
      unpivot (val for col in (val1, val2, val3, val4, val5, val6)
              ) as unpvt
     ) t
group by val
order by val;
Run Code Online (Sandbox Code Playgroud)