首页 > 解决方案 > SQL Server 2018 如何在不同的列中分组信息

问题描述

我有一张这种(非常混乱)格式的表格。这是表中间列的快照,这就是数据中存在大漏洞的原因(其他列中有这些行的内容)。

+---------------+--------------------+--------------+--------------+
|    upsell1    |      upsell2       |   upsell3    |   upsell4    |
+---------------+--------------------+--------------+--------------+
|               |                    | Car Kit      | Scented Tabs |
|               |                    |              |              |
|               |                    |              |              |
|               | Fiters             |              |              |
| NULL          | NULL               | NULL         | NULL         |
|               |                    |              |              |
|               | Car Kit            | Scented Tabs |              |
|               |                    |              |              |
|               |                    |              |              |

+---------------+--------------------+--------------+--------------+

我正在寻找一个输出来对每个产品进行分组和计数,无论它出现在哪一列中。

+--------------+---------------+
|   Product    | Product Count |
+--------------+---------------+
| Car Kit      |             2 |
| Scented Tabs |             2 |
| Fiters       |             1 |
+--------------+---------------+

通常,如果它们都在一个列中,则很容易使用 group by 命令将 X 作为第 1 列,将 count(X) 作为第 2 列,但我正在寻找一种方法来让这些不同的信息正确地组合在一起.

注意:我不能改变表格的结构(让我很懊恼)

标签: sqlsql-servergroup-by

解决方案


我会这样做apply

select v.upsell, count(*)
from t cross apply
     (values (upsell1), (upsell2), (upsell3), (upsell4)) v(upsell)
where v.upsell is not null
group by v.upsell;

你的问题有点不清楚空白是什么。你可能想要:

where v.upsell is not null and v.upsell <> ''

甚至:

where v.upsell is not null and ltrim(rtrim(v.upsell)) <> ''

推荐阅读