2015-10-10 5 views
1

У меня есть база данных продуктовых магазинов. Я хочу подсчитать, сколько продуктов из каждой категории находится в квитанции.Преобразование MS Access и сводный запрос в SQL Server

Таблицы:

  • Transactions (id_transaction, количество, id_receipt, id_product)
  • Receipts (id_receipt, дата, id_store, id_customer)
  • Products (id_product, product_name, цена, id_prod_cat)
  • Product_Categories (id_prod_cat, category_name)

Желаемого выход с данными выборки:

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 

ответ

0

По существу, это классический запрос транспонирования. Рассмотрим следующий SQL, который должен соответствовать большинству RDMS. Для MS Access вы должны использовать IIF() вместо CASE WHEN (и круглые скобки в соединениях). Запрос кросс-таблицы с Transform в основном представляет собой тип доступа MS, а 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 ; 
+0

спасибо, сэр, это работает, но более важно, я видел, что я делаю неправильно. –

Смежные вопросы