I have grocery store database. I want to count how many products from each category are on a receipt.
Tables are:
Transactions
(id_transaction, quantity, id_receipt, id_product) Receipts
(id_receipt, date, id_store, id_customer) Products
(id_product, product_name, price, id_prod_cat) Product_Categories
(id_prod_cat, category_name) Desired output with sample data:
ID_RECEIPT | desserts | meat | juices | baker products| canned |
-------------------------------------------------------------------|
1 | 0 | 2 | 1 | 3 | 0 |
2 | 1 | 0 | 3 | 1 | 0 |
--------------------------------------------------------------------
I've tried this query but with no success.
TRANSFORM Nz(Count(dbo.Transactions.quantity), 0) AS Product Count
SELECT dbo.Receipts.id_receipt
FROM dbo.Product_Categories
INNER JOIN (dbo.Receipts
INNER JOIN (dbo.PRODUCTS
INNER JOIN dbo.TRANSACTIONS ON dbo.PRODUCTS.id_product = dbo.TRANSACTIONS.id_product)
ON dbo.RECEIPTS.id_receipt = dbo.TRANSACTIONS.id_receipt)
ON dbo.Product_Categories.id_prod_cut = dbo.Products.id_product
GROUP BY
dbo.Receipts.id_receipt
PIVOT
dbo.Product_Categories.category_name
Essentially, this is the classic transpose query. Consider the following SQL which should be compliant in most RDMS's. For MS Access, you would use IIF()
instead of CASE WHEN
(and parentheses in the joins). The crosstab query with Transform
is primarily an MS Access type while Pivot()
is primarily an SQL Server function. However, below should work across database dialects.
SELECT
dbo.Receipts.id_receipt,
Count(CASE WHEN dbo.Product_Categories.category_name='desserts'
THEN dbo.Transactions.quantity END) As [desserts],
Count(CASE WHEN dbo.Product_Categories.category_name='meat'
THEN dbo.Transactions.quantity END) As [meat],
Count(CASE WHEN dbo.Product_Categories.category_name='juices'
THEN dbo.Transactions.quantity END) As [juices],
Count(CASE WHEN dbo.Product_Categories.category_name='baker products'
THEN dbo.Transactions.quantity END) As [baker products],
Count(CASE WHEN dbo.Product_Categories.category_name='canned'
THEN dbo.Transactions.quantity END) As [canned]
FROM dbo.Product_Categories
INNER JOIN dbo.Receipts
INNER JOIN dbo.PRODUCTS
INNER JOIN dbo.TRANSACTIONS ON dbo.PRODUCTS.id_product = dbo.TRANSACTIONS.id_product
ON dbo.RECEIPTS.id_receipt = dbo.TRANSACTIONS.id_receipt
ON dbo.Product_Categories.id_prod_cut = dbo.Products.id_product
GROUP BY dbo.Receipts.id_receipt ;
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.