Reputation: 31
Hi all I need your help on the following logic. Currently I have a table that has 300 records, that are related but on this new tables I have the columns called them country, POS so for each combination of country + POs I should have 1 record of table A.
but the situation is that when I am checking the last table someone only inserted some records of table A into table b, and now I have to find what are the missing combination.
could you guide me on the logic that I should use for this, any question please let me know.
Example
Table A name Categories
Milk
Hot Sauces
Meat
Table B
Category POS Country
Milk DF Mexico
Meat DF Mexico
Hot Sauces DF Mexico
Milk CC Canada
Like you can see Canada still missing 2 categories but this table have all Americas countries so let say I have 20 countries. So 20 multiple by 300 categories I should have 6000 distinct records or more because each country have different quantities of POS, right, but someone only inserted let say 3600 records so now I have to find what combination are missed.
Upvotes: 1
Views: 932
Reputation: 14341
If you Don't have a country table you can derive one by selecting DISTINCT Country from your TableB. Then cross join that with Categories for a Cartesian Join (all possible combinations) between Countries and Categories.
SELECT countries.country, c.Category
FROM
(SELECT DISTINCT Country
FROM
@TableB) as countries
CROSS JOIN @Categories c
LEFT JOIN @TableB b
ON countries.Country = b.Country
AND c.Category = b.Cateogry
WHERE
b.Cateogry IS NULL
If you actually need All Possible Combinations of POS and Country and Categories. In this case it sounds like POS is more like a store than a point of sale but same concept. Just derive a POS table if you don't have one and cross join it with the cross join of countries and categories.
SELECT
countries.country, c.Category, pos.POS
FROM
(SELECT DISTINCT Country
FROM
@TableB) as countries
CROSS JOIN @Categories c
CROSS JOIN (SELECT DISTINCT POS
FROM
@TableB) as pos
LEFT JOIN @TableB b
ON countries.Country = b.Country
AND c.Category = b.Cateogry
AND pos.POS = b.POS
WHERE
b.Cateogry IS NULL
But I would guess that not every store is in every country so you probably want to constrain the POS combiantions to POS's that are available in a particular country. Again you can derive the table if you don't have one this time include Country and do an inner join between the derived country table and it.
SELECT
countries.country, c.Category, pos.POS
FROM
(SELECT DISTINCT Country
FROM
@TableB) as countries
CROSS JOIN @Categories c
INNER JOIN (SELECT DISTINCT Country, POS
FROM
@TableB) as pos
ON countries.Country = pos.Country
LEFT JOIN @TableB b
ON countries.Country = b.Country
AND c.Category = b.Cateogry
AND pos.POS = b.POS
WHERE
b.Cateogry IS NULL
test data used:
DECLARE @Categories AS TABLE (Category VARCHAR(25))
DECLARE @TableB AS TABLE (Cateogry VARCHAR(25),POS CHAR(2), Country VARCHAR(25))
INSERT INTO @Categories VALUES ('Milk'),('Hot Sauces'),('Meat')
INSERT INTO @TableB VALUES ('Milk','DF','Mexico'),('Meat','DF','Mexico'),('Hot Sauces','DF','Mexico'),('Milk','CC','Canada'),('Milk','XX','Canada')
Upvotes: 1
Reputation: 5141
Hi,
You can use below logic to get missing data,
SELECT column_name FROM tableA WHERE column_name NOT IN
(SELECT column_name FROM tableB)
Change the required column names and table names in the query. Use same column names in all three places
Upvotes: 1