Подсчитать столбец в соответствии с другим столбцом и отобразить счет в другой таблице - PullRequest
0 голосов
/ 09 мая 2018

Это table A

Wallet Type       State
------------------------
106                1
106                2
106                1
106                1
106                2
112                1
112                2 
112                2 

Теперь мне нужна таблица, в которой подсчитывается тип кошелька в соответствии с состоянием

Table B будет так

    State       Distributor(106)  Agent(112)
    ----------------------------------------
    1                  3             1
    2                  2             2

Ответы [ 5 ]

0 голосов
/ 09 мая 2018

Прежде всего, вам нужно объявить переменную cols, которая даст вам все различные типы кошельков, которые будут использоваться позже в запросе:

 DECLARE @cols AS NVARCHAR(max) =

     Stuff((SELECT DISTINCT ', ' + Convert(nvarchar, WalletType) 
     FROM [IHC].[dbo].[TABLENAMEHERE]
     FOR XML PATH ('')), 1, 2, '')

Что он делает, он получает все отдельные WalletTypes через запятую. как XML Path дает вам данные в XML, так что мы можем играть с ними.

затем используйте оператор PIVOT, как это предлагают некоторые люди. здесь:

        select *
from 
(
 select [state], [WalletType], count([WalletType]) as count FROM [IHC].[dbo].[TABLENAMEHERE]
group by [state], [WalletType]
) SourceTable
pivot
(
  sum(count)
  for [WalletType] in (@cols)
) piv;

первая часть этого запроса дает вам состояние, WalletType, типы 'Count of Wallet', сгруппированные по состоянию и типу кошелька, или, скажем, сломанный w.r.t State и тип кошелька

как это:

состояние WalletType count


1 106 4

2 106 2

1 112 1

2 112 2


теперь этот 'Count of Wallet' как count используется в функции PIVOT, чтобы получить СУММУ СЧЕТА w.r.t Типов кошелька, поэтому он суммирует количество w.r.t WalletType и дает окончательный результат

убедитесь, что вы используете его в динамическом запросе.

0 голосов
/ 09 мая 2018

Проблемы такого типа также можно решить с помощью ключевого слова PIVOT в SQL-сервере. Чтобы узнать больше о PIVOT читайте здесь .

см. Рабочую демонстрацию

Ваш запрос с использованием PIVOT должен выглядеть как

select 
    [state],
    [Distributor(106)]=[106],
    [Agent(112)]=[112]
from
(
    select 
        [state], 
        [cstate]=state, -- created duplicate as this will be consumed in count operation and will not be available as output column later
        [Wallet Type] 
    from tableA
) src
pivot
(
    count(cstate) for [Wallet Type] in ([106],[112])
    )p
0 голосов
/ 09 мая 2018

Вы можете использовать сводную таблицу для этого случая

declare @t1 table (wallet_type int, state int)
insert into @t1
values (106,             1),
(106        ,     2       ),
(106        ,     1       ),
(106        ,     1       ),
(106        ,     2       ),
(112        ,     1       ),
(112        ,     2      ),
(112         ,       2    )
--select * from @t1

select *
from 
(
 select state, wallet_type, count(wallet_type) 'count' from @t1 
group by state, wallet_type
) src
pivot
(
  sum(count)
  for wallet_type in ([106], [112])
) piv;

Онлайн-демонстрация: http://rextester.com/QBTOQ8569

0 голосов
/ 09 мая 2018

Попробуйте это ... (Динамический PIVOT)

DECLARE @cols AS NVARCHAR(max) = Stuff((SELECT DISTINCT ', ' + Quotename(WalletType) 
         FROM   TableName
         FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); 

DECLARE @query AS NVARCHAR(max) = ' SELECT *
                                    FROM   TableName
                                           PIVOT ( Count(wallettype) 
                                                 FOR wallettype IN ('+@cols+') ) pvt';

EXECUTE(@query)

Выход

+-------+-----+-----+
| State | 106 | 112 |
+-------+-----+-----+
|     1 |   3 |   1 |
|     2 |   2 |   2 |
+-------+-----+-----+
0 голосов
/ 09 мая 2018

Попробуйте это:

Вы можете получить это, используя Aggregate функции.

SUM:

SELECT State
    ,SUM(CASE WHEN Wallet_Type = 106 THEN 1 ELSE 0 END) Distributor_106
    ,SUM(CASE WHEN Wallet_Type = 112 THEN 1 ELSE 0 END) Distributor_112
FROM Your_Table
WHERE Wallet_Type IN (106, 112)
GROUP BY State

COUNT:

SELECT State
    ,COUNT(CASE WHEN Wallet_Type = 106 THEN 1 END) Distributor_106
    ,COUNT(CASE WHEN Wallet_Type = 112 THEN 1 END) Distributor_112
FROM Your_Table
WHERE Wallet_Type IN (106, 112)
GROUP BY State
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...