How to group by columns in a different table

Viewed 49

I am trying to write a query to return the sum of totalRxCount that is grouped by zipcode.

I have two tables named fact2 and demographic.

My problem is that in the demographic table there are duplicate rows which affects the sum of totalRxCount.

To avoid duplicates I am wanting to only return results where npiNum is distinct.

Right now I have this working but it is grouping by relId (the primary key).

I cannot figure out a way to group by zipcode since this column and totalRxCount are in separate tables.

When I try this I am getting wrong results since it is counting the duplicate rows.

Here is my query. I am wanting to modify this to return results grouped by zipcode instead of relId.

Any input will be greatly appreciated!

SELECT fact2.relID
     , SUM(fact2.`totalRxCount`)
  FROM fact2 
  LEFT 
  JOIN   (
                SELECT O1.relId, COUNT(DISTINCT O1.npiNum)
  FROM demographic As O1
GROUP BY O1.relId
                ) AS d1
        ON d1.`relId` = fact2.relID
  LEFT 
  JOIN   (
                SELECT O2.relID, Sum(O2.totalRxCount) 
                FROM fact2 AS O2
                GROUP BY O2.relID
                ) AS p1
        ON p1.relID = d1.relId
WHERE (monthEndDate BETWEEN 201911 AND 202010) GROUP BY fact2.relID; 

Results:

+-------+---------------------------+
| relID | SUM(fact2.totalRxCount) |
+-------+---------------------------+
|  2465 |                         2 |
+-------+---------------------------+

What I've tried

SELECT zipcode, SUM(fact2.`totalRxCount`)
FROM fact2
INNER JOIN demographic ON demographic.relId=fact2.relID
    LEFT JOIN   (
                SELECT O1.`relId`, COUNT(DISTINCT O1.`npiNum`)
                FROM demographic As O1
                GROUP BY O1.`relId`
                ) AS d1
        ON d1.`relId` = fact2.`relID`
    LEFT JOIN   (
                SELECT O2.`relID`, Sum(O2.`totalRxCount`) 
                FROM fact2 AS O2
                GROUP BY O2.`relID`
                ) AS p1
        ON p1.`relID` = d1.`relId`
WHERE (`monthEndDate` BETWEEN 201911 AND 202010) GROUP BY zipcode;

This is returning the sum multiplied by number of duplicate rows in demographic.

Results:

+---------+---------------------------+
| zipcode | SUM(fact2.`totalRxCount`) |
+---------+---------------------------+
|   66097 |                         4 |
+---------+---------------------------+
                                    ^ This should be 2

demographic table:

+-------+---------+------------+------------+-----------+------------+------------------------------------+-------+----------+----------+-----------------+------------+-------+--------------+---------+----------+-----------+--------+-------------+--------+--------+----------------+
| relId | zipcode | providerId | writerType | firstName | middleName |              lastName              | title | specCode | specDesc |     address     |    city    | state | amaNoContact | pdrpInd | pdrpDate |  deaNum   | amaNum | amaCheckDig | npiNum | terrId | callStatusCode |
+-------+---------+------------+------------+-----------+------------+------------------------------------+-------+----------+----------+-----------------+------------+-------+--------------+---------+----------+-----------+--------+-------------+--------+--------+----------------+
|  2465 |   66097 |            | A          |           |            | JEFFERSON COUNTY MEMORIAL HOSPITAL |       |          |          | 408 DELAWARE ST | WINCHESTER | KS    |              |         |          | AJ4281096 |        |             |        |  11604 |                |
|  2465 |   66097 |            | A          |           |            | JEFFERSON COUNTY MEMORIAL HOSPITAL |       |          |          | 408 DELAWARE ST | WINCHESTER | KS    |              |         |          | AJ4281096 |        |             |        |  11604 |                |
+-------+---------+------------+------------+-----------+------------+------------------------------------+-------+----------+----------+-----------------+------------+-------+--------------+---------+----------+-----------+--------+-------------+--------+--------+----------------+

fact2

+-------+----------+-----------------+-----------+-------------------+----------+------------+------------+--------+------------+--------------+------------+---------------+--------------+-----------+--------------+-------------+-----------+--------------+-------------+
| relID | marketId |   marketName    | productID |    productName    | dataType | providerId | writerType | planId | pmtTypeInd | monthEndDate | newRxCount | refillRxCount | totalRxCount | newRxQuan | refillRxQuan | totalRxQuan | newRxCost | refillRxCost | totalRxCost |
+-------+----------+-----------------+-----------+-------------------+----------+------------+------------+--------+------------+--------------+------------+---------------+--------------+-----------+--------------+-------------+-----------+--------------+-------------+
|  2465 |    10871 | GALT PP MONTHLY |   1399451 | ZOLPIDEM TARTRATE |       15 |            | A          | 900145 | C          |       202004 |          1 |             0 |            1 |        30 |            0 |          30 |       139 |            0 |         139 |
|  2465 |    10871 | GALT PP MONTHLY |   1399458 | ESZOPICLONE       |       15 |            | A          | 900145 | C          |       202006 |          1 |             0 |            1 |        30 |            0 |          30 |       350 |            0 |         350 |
+-------+----------+-----------------+-----------+-------------------+----------+------------+------------+--------+------------+--------------+------------+---------------+--------------+-----------+--------------+-------------+-----------+--------------+-------------+
0 Answers
Related