SQL Server 2018 Как я могу сгруппировать информацию в разные столбцы - PullRequest
0 голосов
/ 24 сентября 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 |
+--------------+---------------+

Обычно, если бы он был все в одном столбце, было бы достаточно легко использовать группирование по команде, чтобы в качестве столбца 1 был указан X, а количество(X) как столбец 2, но я не могу найти способ собрать эту разрозненную информацию для правильной группировки.

Примечание: я не могу изменить структуру стола (к моему большому огорчению)

Ответы [ 4 ]

0 голосов
/ 24 сентября 2018

Я бы сделал это, используя 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)) <> ''
0 голосов
/ 24 сентября 2018

Попробуй.

    declare @test table (
    upsell1 varchar(100),
    upsell2 varchar(100),       
    upsell3 varchar(100),
    upsell4 varchar(100)

)
insert into @test values ('','','Car Kit','Scented Tabs')
insert into @test values ('','','','')
insert into @test values ('','','','')
insert into @test values ('','Fiters','','')
insert into @test values (null,null,null,null)
insert into @test values ('','','','')
insert into @test values ('','Car Kit','Scented Tabs','')
insert into @test values ('','','','')
insert into @test values ('','','','')

select 
    abc,
    count(*) 
from (
select *
from @test) as src
unpivot (
abc for anyThing in (upsell1,upsell2,upsell3,upsell4)
) as ttt
group by abc
0 голосов
/ 24 сентября 2018

Поскольку нет предположений типа, я выбрал бы безопасный метод с UNPIVOT:

SELECT * INTO #t FROM (VALUES
    ('','','Car Kit','Scented Tabs'),
    ('','','',''),
    ('','','',''),
    ('','Fiters','',''),
    (null,null,null,null),
    ('','','',''),
    ('','Car Kit','Scented Tabs',''),
    ('','','',''),
    ('','','','')
) T(upsell1,upsell2,upsell3,upsell4)

SELECT Product, COUNT(Product) [Product Count] FROM
(
    SELECT
        CAST(upsell1 AS nvarchar(MAX)) upsell1,
        CAST(upsell2 AS nvarchar(MAX)) upsell2,
        CAST(upsell3 AS nvarchar(MAX)) upsell3,
        CAST(upsell4 AS nvarchar(MAX)) upsell4
    FROM #t
) T
UNPIVOT (Product for X IN (upsell1,upsell2,upsell3,upsell4)) P
WHERE Product != ''
GROUP BY Product

Результат

Product         Product Count
--------------- -------------
Car Kit         2
Fiters          1
Scented Tabs    2
0 голосов
/ 24 сентября 2018

Предполагая, что у вас нет контроля над ужасной схемой ...

with CTE as
(
select upsell1 as product, 1 as counter
from MyTable
where upsell1 is not null

union all
select upsell2, 1
from MyTable
where upsell2 is not null

union all
select upsell3, 1
from MyTable
where upsell3 is not null

union all
select upsell4, 1
from MyTable
where upsell4 is not null
)
select product, sum(counter)
from CTE
group by product
...