Pierre Ammoun
asked on
SQL Statement How to get the "non-data" ?
I have 3 tables.
Table1 : Items - Itemcode - Description - Brand -
Table 2 : Customers : Customercode - CustomerName - Salesrep
Table 3 :Transactions : Date - Reference-CustomerCode-Sal esrep-Item code - Qty-Value-
my question is as follows:
I need to know what customers did NOT buy from that item- (i.e. there is no record in Transactions that has this customer and this item)
The second question will be how can them all ...
i.e. each customer what are the items that they did not buy (no transaction)
Thank you
Table1 : Items - Itemcode - Description - Brand -
Table 2 : Customers : Customercode - CustomerName - Salesrep
Table 3 :Transactions : Date - Reference-CustomerCode-Sal
my question is as follows:
I need to know what customers did NOT buy from that item- (i.e. there is no record in Transactions that has this customer and this item)
The second question will be how can them all ...
i.e. each customer what are the items that they did not buy (no transaction)
Thank you
Is this an homework or exam related question?
ASKER
Nor this nor that.
I am a software developer and I have this problem that I am not being able to solve.
A brute-force solution was to do a dual -scan (scan the items and for each item scan the transactions table) but I hit a rock when the records were too much and it would take a huge amount of time that most of the time I have to "kill" the task.
Thanks
I am a software developer and I have this problem that I am not being able to solve.
A brute-force solution was to do a dual -scan (scan the items and for each item scan the transactions table) but I hit a rock when the records were too much and it would take a huge amount of time that most of the time I have to "kill" the task.
Thanks
Try..
For question 1..
For question 2
For question 1..
SELECT * FROM Customers c
FULL OUTER JOIN Transactions t ON c.CustomerCode = t.CustomerCode
WHERE t.customer IS NULL
For question 2
SELECT I.Itemcode , I.Description,c.customerId FROM Customers c
OUTER APPLY
(
SELECT I.Itemcode , I.Description , t.Transactions FROM Transactions t
INNER JOIN Items I on t.Itemcode = I.Itemcode
WHERE c.CustomerCode = t.CustomerCode
)p
WHERE t.customer IS NULL
ASKER
Pawan Kumar Khowal
thank You for your feedback.
Yet in the first select statement, I fail to see the itemcode ...
The thing is that the form I am trying to design, will ask for an itemcode , and when you hit "Continue" it should show you the customers that did not take from that item.
In the first statement, I did not see any reference to an item !
Thanks
thank You for your feedback.
Yet in the first select statement, I fail to see the itemcode ...
The thing is that the form I am trying to design, will ask for an itemcode , and when you hit "Continue" it should show you the customers that did not take from that item.
In the first statement, I did not see any reference to an item !
Thanks
These are the kind of questions I had when learning databases. That's why I asked.
You have some options but I like the NOT EXISTS:
You have some options but I like the NOT EXISTS:
-- Question 1
SELECT Customercode, CustomerName, Salesrep
FROM Customers
WHERE NOT EXISTS (SELECT 1
FROM Transactions
WHERE Transactions.CustomerCode = Customers.Customercode
AND Itemcode = @ItemCodeToSearch)
-- Question 2
SELECT Customers.Customercode, Customers.CustomerName, Items.Itemcode, Items.Description
FROM Customers
INNER JOIN Transactions ON Transactions.CustomerCode = Customers.Customercode
INNER JOIN Items ON Items.Itemcode = Transactions.Itemcode
WHERE NOT EXISTS (SELECT 1
FROM Transactions T2
WHERE T2.CustomerCode = Customers.Customercode
AND T2.Itemcode = Items.Itemcode)
NOTE: I didn't test the code so please check if returns what you need.
try this ..
DECLARE @ItemCode AS VARCHAR(10) = 'abc'
SELECT I.Itemcode , I.Description, c.customerId FROM Customers c
OUTER APPLY
(
SELECT I.Itemcode , I.Description , t.Transactions FROM Transactions t
INNER JOIN Items I on t.Itemcode = I.Itemcode
WHERE c.CustomerCode = t.CustomerCode
AND t.Itemcode = @ItemCode
)p
WHERE t.customer IS NULL
Is the second query I posted earlier is fine for you ?
ASKER
Pawan Kumar Khowal
Still checking it.... :)
Still checking it.... :)
ASKER
Vitor Montalvão
Thank you . The first part is covered by your answer.
Yet the second one, gives me an error (error correlating fields)
Thanks
Thank you . The first part is covered by your answer.
Yet the second one, gives me an error (error correlating fields)
Thanks
Please post the error since I can't test it.
You missed the alias in the subselect:
WHERE NOT EXISTS (SELECT 1
FROM Transactions T2
WHERE T2.CustomerCode = Customers.Customercode
AND T2.Itemcode = Items.Itemcode)
WHERE NOT EXISTS (SELECT 1
FROM Transactions T2
WHERE T2.CustomerCode = Customers.Customercode
AND T2.Itemcode = Items.Itemcode)
@Author - Can you try mine if possible ?
ASKER
Pawan Kumar Khowal
Thank you once again but my problem with your second answer is that in VFP (my programming language) I do not have the Apply Command in SQL Statement !
I think I made a mistake by saying that I was looking for a SQL Statment... I thought that VFP works the same way as SQL . Seems that there are certain commands not applicable !
Thanks again!
Thank you once again but my problem with your second answer is that in VFP (my programming language) I do not have the Apply Command in SQL Statement !
I think I made a mistake by saying that I was looking for a SQL Statment... I thought that VFP works the same way as SQL . Seems that there are certain commands not applicable !
Thanks again!
Okies,
SELECT I.Itemcode , I.Description,c.customerId FROM Customers c
FULL OUTER JOIN
(
SELECT I.Itemcode , I.Description , t.Transactions FROM Transactions t
INNER JOIN Items I on t.Itemcode = I.Itemcode
)p
ON c.CustomerCode = p.CustomerCode
WHERE p.customer IS NULL
You're using VFP and this may have impact on the query. It should work perfectly in SQL Server.
Lets try to make a small modification:
Lets try to make a small modification:
SELECT Accounts.Account, Accounts.AccName, Items.Itemcode, Items.Description
FROM Accounts
INNER JOIN Transtok
INNER JOIN Items ON Items.Itemcode = Transtok.Itemcode
ON Transtok.Customer = Accounts.Account
WHERE NOT EXISTS (SELECT 1
FROM Transtok T2
WHERE T2.Customer = Accounts.Account
AND T2.Itemcode = Items.Itemcode)
ASKER
Vitor Montalvão
Same Error ! error correlating fields..
Same Error ! error correlating fields..
Check for a tool that will convert this tsql to VFP.. May be tool available online.
I guess VFP doesn't accept very well the JOIN so here's an old school solution:
SELECT Accounts.Account, Accounts.AccName, Items.Itemcode, Items.Description
FROM Accounts, Transtok,Items
WHERE Items.Itemcode = Transtok.Itemcode
AND Transtok.Customer = Accounts.Account
AND NOT EXISTS (SELECT 1
FROM Transtok T2
WHERE T2.Customer = Accounts.Account AND T2.Itemcode = Items.Itemcode)
ASKER
Vitor Montalvão
Sorry,
but same problem again !
Sorry,
but same problem again !
Only have a phone but this might help q1
Select c.*
From customers c
Left join transactions t on c.custno = t.custno
Where t.itemno IS NULL
Select c.*
From customers c
Left join transactions t on c.custno = t.custno
Where t.itemno IS NULL
ASKER CERTIFIED SOLUTION
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
ASKER
I m using vfp 9
I m using vfp 9I guess is the last version, right?
Did you try my last query?
ASKER
Vitor Montalvão
We are getting somewhere ! Now no more error, but this time the Query returns an empty cursor.
Which is not possible. I know for a fact that there are many items not linked to any transactions (per customer)
Thanks
We are getting somewhere ! Now no more error, but this time the Query returns an empty cursor.
Which is not possible. I know for a fact that there are many items not linked to any transactions (per customer)
Thanks
Ok I need some data mockup.
Can you post non real data sample so I can play with it to verify what's missing?
Can you post non real data sample so I can play with it to verify what's missing?
ASKER
OK. I would need few min.
Thanks
Thanks
ASKER
Which format ?
Excel or CSV will be good so I can import it easily.
ASKER
Vitor Montalvão,
Thank you very much for your efforts.
I took the first SQL Statement and tweaked it a little (put it in a SCAN function) and got what I needed.
Thank you very very much.
Regards
Thank you very much for your efforts.
I took the first SQL Statement and tweaked it a little (put it in a SCAN function) and got what I needed.
Thank you very very much.
Regards
Why is a suggested query using outer apply that could not be used chosen as an assisted answer?
Points should not be allocated for mere participation or volune of participation. The enduring value of the question/answer database is reduced if that happens.
Points should not be allocated for mere participation or volune of participation. The enduring value of the question/answer database is reduced if that happens.
ASKER
PortletPaul
The outer Apply syntax did not work with me and therefore I did not consider it as part of the solution.
As I said it is my mistake that I did not specify that it was for a VFP application and not a "pure" SQL hence the impossibility for me to test the outer apply syntax.
I hope I could clear the matter and once again I apologize for not being accurate in the question.
The outer Apply syntax did not work with me and therefore I did not consider it as part of the solution.
As I said it is my mistake that I did not specify that it was for a VFP application and not a "pure" SQL hence the impossibility for me to test the outer apply syntax.
I hope I could clear the matter and once again I apologize for not being accurate in the question.
Pierre, can you close this question properly?
Cheers.
Cheers.
I don't remember anymore which comments were marked as solution and looks like Pierre didn't return to close this properly.
previously
ID: 41817753 350 points
ID: 41817754 150 points
but that was incorrect
ID: 41817753 350 points
ID: 41817754 150 points
but that was incorrect