简体   繁体   中英

Convert MS Access count and pivot query into SQL Server

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM