Использование Column в «Case when» без включения в Group By - или использование разделения над - PullRequest
0 голосов
/ 27 сентября 2019

Ниже приведены две таблицы.И я также показал требуемый результат ниже.

ТАБЛИЦА A

+------------+--------------+
| InvoiceNo. | InvoiceTotal |
+------------+--------------+
|          1 |          190 |
|          2 |          360 |
|          3 |          170 |
|          4 |          269 |
|          5 |           30 |
+------------+--------------+

ТАБЛИЦА B

+------------+--------------+------+-----------+
| InvoiceNo. |   TaxName    | Tax% | TaxAmount |
+------------+--------------+------+-----------+
|          1 | State 5%     |    5 | 9.5       |
|          1 | Local  5%    |    5 | 9.5       |
|          1 | State 7%     |    7 | 13.3      |
|          1 | Local  7%    |    7 | 13.3      |
|          2 | National 10% |   10 | 36        |
|          3 | State 4%     |    4 | 6.8       |
|          3 | Local  4%    |    4 | 6.8       |
|          4 | State 6%     |    6 | 16.14     |
|          4 | Local  6%    |    6 | 16.14     |
|          5 | National 14% |   14 | 4.2       |
+------------+--------------+------+-----------+

Обязательный ВЫХОД

Группировка по (InvoiceNo, Tax%) и сумме (Tax%, TaxAmount) Но

Если TaxName похож на «State» или «Local», то выполняетсяв столбец «Штат + местный» с суммой штатов + местный налог%. Если TaxName похож на «National», то переходит в столбец «National»

+-----------+--------------+-------------+----------+--------------------+----------------+
| InvoiceNo | InvoiceTotal | State+Local | National | State+Local_Amount | NationalAmount |
+-----------+--------------+-------------+----------+--------------------+----------------+
|         1 |          120 |          10 |        0 | 19                 | 0              |
|         1 |          120 |          14 |        0 | 26.6               | 0              |
|         2 |          360 |           0 |       10 | 0                  | 36             |
|         3 |           85 |           8 |        0 | 13.6                | 0              |
|         4 |          269 |          12 |        0 | 32.28              | 0              |
|         5 |           30 |           0 |       14 | 0                  | 4.2            |
+-----------+--------------+-------------+----------+--------------------+----------------+

. Вот что я делаю

CREATE TABLE #tableA(InvoiceNo varchar(100), InvoiceTotal float)
insert into #tableA values
('1',190),  
('2',360),  
('3',170),  
('4',269),  
('5',30)


CREATE TABLE #tableB(InvoiceNo varchar(100), TaxName varchar(25), TaxPercentile float, TaxAmount float)
INSERT INTO #tableB VALUES
('1','State 5%',5, 9.5),
('1','Local 5%',5, 9.5),
('1','State 7%',7, 13.3),
('1','Local 7%',7, 13.3),
('2','National 10%',10, 36),
('3','State 4%',4, 6.8),
('3','Local 4%',4, 6.8),
('4','State 6%',6, 16.14),
('4','Local 6%',6, 16.14),
('5','National 14%',14, 4.2)



select B.InvoiceNo, A.InvoiceTotal, 
case when TaxName like '%State%' or TaxName like '%Local%' then sum(b.TaxPercentile) else 0 End as [StateLocal], 
case when TaxName like '%National%' then sum(b.TaxPercentile) else 0 End as [National],
case when TaxName like '%State%' or TaxName like '%Local%' then sum(b.TaxAmount) else 0 End as [StateLocal_Amount], 
case when TaxName like '%National%' then sum(b.TaxAmount) else 0 End as [NationalAmount]
from #tableB B
Left join #TableA A on a.InvoiceNo = b.InvoiceNo
Group by b.InvoiceNo, A.InvoiceTotal 
-- if i include "TaxName" in group by then it does not returns required output
-- if i do not include "TaxName" in Group by then it gives error saying i have to include TaxName in group by

Если я включаю «TaxName» в группу к тому времени, он не возвращает требуемый вывод.

Если я не включаю «TaxName» в группу к тому времени, выдает ошибку, говорящую, что у меня естьвключить TaxName в группу по.

Можно ли это сделать с помощью Разделения поверх в случае, когда выписка?Если да, то как или как обстоят дела?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Это должен быть ваш запрос:

with taxes as (
select invoiceNo,
       round(sum(case when taxname like 'State%' or taxname like 'Local%' then taxpercentile else 0 end), 2) 'State+Local', 
       round(sum(case when taxname like 'National%' then taxpercentile else 0 end), 2) 'National',
       round(sum(case when taxname like 'State%' or taxname like 'Local%' then taxamount else 0 end), 2) 'State+Local_Amount',
       round(sum(case when taxname like 'National%' then taxamount else 0 end), 2) 'National_Amount'
from tableb
group by invoiceno
)
    select a.*, t.*
      from tablea a
inner join taxes t 
        on a.invoiceno = t.invoiceno

Вы можете проверить это в SQLFiddle .

0 голосов
/ 27 сентября 2019

попробуйте, как показано ниже. Я добавил агрегацию также на InvoiceTotal

   select B.InvoiceNo, sum(A.InvoiceTotal), 
   sum( case when TaxName like '%State%' or TaxName like '%Local%'
      then   b.TaxPercentile else 0 End) as [StateLocal], 
   sum(case when TaxName like '%National%' 
   then (b.TaxPercentile) else 0 End) as [National],
   sum( case when TaxName like '%State%' or TaxName like '%Local%'
      then b.TaxAmount else 0 End )as [StateLocal_Amount], 
   sum(case when TaxName like '%National%' 
    then b.TaxAmount else 0 End ) as [NationalAmount]
    from #tableB B
    Left join #TableA A on a.InvoiceNo = b.InvoiceNo
    Group by b.InvoiceNo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...