Reputation: 49
I am trying to translate the following Query from MS Access to 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;
Using this thread write a TRANSFORM statement in Sql Server and this other resource https://www.sqlshack.com/multiple-options-to-transposing-rows-into-columns/ I've gotten to these 2 separate points, I think the first with the case statements is working accurately, but how do I create the pivot version in 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
This my initial data 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
}
</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>
These are the results I expect to get:
<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>
Thank you in advance for any help/advice!
Upvotes: 0
Views: 168
Reputation: 2460
You were close and on the right track. Also, be careful using reserved keywords such as 'Primary' for column names. See if the following works.
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
Upvotes: 1