Перевести оператор MS Access TRANSFORM в T- SQL - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь перевести следующий запрос из MS Access в T- SQL:

TRANSFORM COUNT(TableA.Primary) AS CountOfPrimary
SELECT 
TableA.Id1
,TableA.Id2
FROM TableA
GROUP BY TableA.Id1, TableA.Id2
ORDER BY TableA.Id1
PIVOT TableA.Primary;

Используя этот поток написать оператор TRANSFORM в Sql Сервер и это другой ресурс https://www.sqlshack.com/multiple-options-to-transposing-rows-into-columns/ Я дошел до этих двух отдельных моментов, я думаю, что первое с инструкциями case работает точно, но как мне создать сводную версию в T- SQL?

SELECT DISTINCT 
    Id1
    ,Id2
    ,'1' = MAX(CASE WHEN Primary = '1' THEN 1 ELSE NULL END)
    ,'0' = MAX(CASE WHEN Primary = '0' THEN 1 ELSE NULL END)
FROM TableA
GROUP BY Id1, Id2
ORDER BY Id1
SELECT *
FROM (
    SELECT 
        Id1
        ,Id2
        ,CountOfPrimary = COUNT(Primary)
    FROM TableA
) ts
PIVOT (
    COUNT(Primary)
    FOR CountOfPrimary IN (0,1)
) pt

Это моя исходная таблица данных:

<style type="text/css">
  .tg {
    border-collapse: collapse;
    border-spacing: 0;
  }
  
  .tg td {
    font-family: Arial, sans-serif;
    font-size: 14px;
    padding: 10px 5px;
    border-style: solid;
    border-width: 1px;
    overflow: hidden;
    word-break: normal;
    border-color: black;
  }
  
  .tg th {
    font-family: Arial, sans-serif;
    font-size: 14px;
    font-weight: normal;
    padding: 10px 5px;
    border-style: solid;
    border-width: 1px;
    overflow: hidden;
    word-break: normal;
    border-color: black;
  }
  
  .tg .tg-0pky {
    border-color: inherit;
    text-align: left;
    vertical-align: top
  }
</style>
<table class="tg">
  <tr>
    <th class="tg-0pky">Id1</th>
    <th class="tg-0pky">Id2</th>
    <th class="tg-0pky">Primary</th>
  </tr>
  <tr>
    <td class="tg-0pky">8574</td>
    <td class="tg-0pky">9401</td>
    <td class="tg-0pky">1</td>
  </tr>
  <tr>
    <td class="tg-0pky">2154</td>
    <td class="tg-0pky">5604</td>
    <td class="tg-0pky">1</td>
  </tr>
  <tr>
    <td class="tg-0pky">3129</td>
    <td class="tg-0pky">6255</td>
    <td class="tg-0pky">1</td>
  </tr>
  <tr>
    <td class="tg-0pky">2714</td>
    <td class="tg-0pky">7750</td>
    <td class="tg-0pky">1</td>
  </tr>
  <tr>
    <td class="tg-0pky">3902</td>
    <td class="tg-0pky">9585</td>
    <td class="tg-0pky">1</td>
  </tr>
  <tr>
    <td class="tg-0pky">0535</td>
    <td class="tg-0pky">6880</td>
    <td class="tg-0pky">1</td>
  </tr>
  <tr>
    <td class="tg-0pky">0765</td>
    <td class="tg-0pky">9401</td>
    <td class="tg-0pky">1</td>
  </tr>
  <tr>
    <td class="tg-0pky">5946</td>
    <td class="tg-0pky">9401</td>
    <td class="tg-0pky">1</td>
  </tr>
  <tr>
    <td class="tg-0pky">7074</td>
    <td class="tg-0pky">9585</td>
    <td class="tg-0pky">1</td>
  </tr>
  <tr>
    <td class="tg-0pky">7181</td>
    <td class="tg-0pky">9585</td>
    <td class="tg-0pky">0</td>
  </tr>
  <tr>
    <td class="tg-0pky">7181</td>
    <td class="tg-0pky">9585</td>
    <td class="tg-0pky">1</td>
  </tr>
  <tr>
    <td class="tg-0pky">8635</td>
    <td class="tg-0pky">9401</td>
    <td class="tg-0pky">1</td>
  </tr>
  <tr>
    <td class="tg-0pky">0334</td>
    <td class="tg-0pky">4433</td>
    <td class="tg-0pky">0</td>
  </tr>
  <tr>
    <td class="tg-0pky">0334</td>
    <td class="tg-0pky">4433</td>
    <td class="tg-0pky">1</td>
  </tr>
  <tr>
    <td class="tg-0pky">0623</td>
    <td class="tg-0pky">5604</td>
    <td class="tg-0pky">1</td>
  </tr>
</table>

Вот результаты, которые я ожидаю получить:

<style type="text/css">
.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
.tg .tg-0pky{border-color:inherit;text-align:left;vertical-align:top}
.tg .tg-0lax{text-align:left;vertical-align:top}
</style>
<table class="tg">
  <tr>
    <th class="tg-0pky">Id1</th>
    <th class="tg-0pky">Id2</th>
    <th class="tg-0pky">1</th>
    <th class="tg-0lax">0</th>
  </tr>
  <tr>
    <td class="tg-0pky">8574</td>
    <td class="tg-0pky">9401</td>
    <td class="tg-0pky">1</td>
    <td class="tg-0lax">NULL</td>
  </tr>
  <tr>
    <td class="tg-0pky">2154</td>
    <td class="tg-0pky">5604</td>
    <td class="tg-0pky">1</td>
    <td class="tg-0lax">NULL</td>
  </tr>
  <tr>
    <td class="tg-0pky">3129</td>
    <td class="tg-0pky">6255</td>
    <td class="tg-0pky">1</td>
    <td class="tg-0lax">NULL</td>
  </tr>
  <tr>
    <td class="tg-0pky">2714</td>
    <td class="tg-0pky">7750</td>
    <td class="tg-0pky">1</td>
    <td class="tg-0lax">NULL</td>
  </tr>
  <tr>
    <td class="tg-0pky">3902</td>
    <td class="tg-0pky">9585</td>
    <td class="tg-0pky">1</td>
    <td class="tg-0lax">NULL</td>
  </tr>
  <tr>
    <td class="tg-0pky">0535</td>
    <td class="tg-0pky">6880</td>
    <td class="tg-0pky">1</td>
    <td class="tg-0lax">NULL</td>
  </tr>
  <tr>
    <td class="tg-0pky">0765</td>
    <td class="tg-0pky">9401</td>
    <td class="tg-0pky">1</td>
    <td class="tg-0lax">NULL</td>
  </tr>
  <tr>
    <td class="tg-0pky">5946</td>
    <td class="tg-0pky">9401</td>
    <td class="tg-0pky">1</td>
    <td class="tg-0lax">NULL</td>
  </tr>
  <tr>
    <td class="tg-0pky">7074</td>
    <td class="tg-0pky">9585</td>
    <td class="tg-0pky">1</td>
    <td class="tg-0lax">NULL</td>
  </tr>
  <tr>
    <td class="tg-0pky">7181</td>
    <td class="tg-0pky">9585</td>
    <td class="tg-0pky">1</td>
    <td class="tg-0lax">1</td>
  </tr>
  <tr>
    <td class="tg-0pky">8635</td>
    <td class="tg-0pky">9401</td>
    <td class="tg-0pky">1</td>
    <td class="tg-0lax">NULL</td>
  </tr>
  <tr>
    <td class="tg-0pky">0334</td>
    <td class="tg-0pky">4433</td>
    <td class="tg-0pky">1</td>
    <td class="tg-0lax">1</td>
  </tr>
  <tr>
    <td class="tg-0pky">0623</td>
    <td class="tg-0pky">5604</td>
    <td class="tg-0pky">1</td>
    <td class="tg-0lax">NULL</td>
  </tr>
</table>

Заранее благодарю за любую помощь / совет!

1 Ответ

1 голос
/ 07 января 2020

Вы были близки и на правильном пути. Кроме того, будьте осторожны, используя зарезервированные ключевые слова, такие как «Основной» для имен столбцов. Посмотрите, работает ли следующее.

DECLARE @tab TABLE (Id1 VARCHAR(10), Id2 VARCHAR(10), Pri INT)
INSERT @tab VALUES
('8574','9401',1),
('2154','5604',1),
('3129','6255',1),
('2714','7750',1),
('3902','9585',1),
('0535','6880',1),
('0765','9401',1),
('5946','9401',1),
('7074','9585',1),
('7181','9585',0),
('7181','9585',1),
('8635','9401',1),
('0334','4433',0),
('0334','4433',1),
('0623','5604',1)


SELECT Id1, Id2, [1], CASE WHEN [0] = 0 THEN NULL ELSE [0] END AS [0]
FROM (
    SELECT 
        Id1
        ,Id2
        ,Pri
    FROM @tab
) ts
PIVOT (
    COUNT(Pri)
    FOR Pri IN ([1],[0])
) pt
...