簡體   English   中英

將MS Access計數和數據透視查詢轉換為SQL Server

[英]Convert MS Access count and pivot query into SQL Server

我有雜貨店數據庫。 我想計算收據上每個類別有多少產品。

表是:

  • Transactions (id_transaction,數量,id_receipt,id_product)
  • Receipts (id_receipt,日期,id_store,id_customer)
  • Products (id_product,product_name,price,id_prod_cat)
  • Product_Categories類別(id_prod_cat,類別名稱)

所需的輸出與樣本數據:

ID_RECEIPT |   desserts | meat |   juices | baker products| canned |
-------------------------------------------------------------------|
1          |   0        |   2  |    1     |     3         |   0    |
2          |   1        |   0  |    3     |     1         |   0    |
--------------------------------------------------------------------

我已經嘗試過此查詢,但沒有成功。

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

本質上,這是經典的轉置查詢。 考慮以下應與大多數RDMS兼容的SQL。 對於MS Access,您將使用IIF()而不是CASE WHEN (和聯接中的括號)。 使用Transform的交叉表查詢主要是MS Access類型,而Pivot()主要是SQL Server函數。 但是,以下內容應可跨數據庫方言使用。

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 ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM