2013-03-28 3 views
1

У меня есть сценарий, который аналогичен приведенному ниже:Sql запрос с графом и GroupBy

Есть две таблицы Transaction и Product

Transaction таблица имеет столбцы

Id, Amount ProductId TransactionDate ,DepartmentId 
1, 100  100  01/01/2013  1 
2, 200  101  02/01/2013  2 and so on.... 

Product таблица имеет колонны

Id, Name, ProductType. 
100, AB , 1 
101 C ,  2 

Я хочу, чтобы написать один хранимую процедуру, которая выводит следующее:

Month Year Department Count(Transactions) Count(Transactions of ProductType1) 
Feb 2012 1    100      50 
Mar 2012 1    100      50 
Apr 2012 1    100      50 
Feb 2012 2    100      50 

я до сюда:

select 
    YEAR(T.TransactionDate) AS [YEAR], 
    MONTH(T.TransactionDate) AS [MONTH], 
    Count(T.Id) 
from 
    Transaction T 
INNER JOIN 
    Product P ON P.Id = T.ProductId 
group by 
    T.DepartmentId, YEAR(T.TransactionDate), MONTH(T.TransactionDate); 

Он выводит следующее:

Month Year Department Count(Transactions) 

Я хочу знать, как Я также могу включить:

Count(Transactions of ProductType1) 

Я также попытался это:

select 
    YEAR(T.TransactionDate) AS [YEAR], 
    MONTH(T.TransactionDate) AS [MONTH],  
    Count(T.Id) 
    (Select Count(T.Id) 
    from Transaction T 
    INNER JOIN Product P ON P.Id = T.ProductId 
    where P.Id = 1) 
from 
    Transaction T 
INNER JOIN 
    Product P ON P.Id = T.ProductId 
group by 
    T.DepartmentId, YEAR(T.TransactionDate), MONTH(T.TransactionDate); 

Это дает мне неточные результаты для сделок подсчитывать, где ProductID = 1 из группы по п

Я не хочу писать отдельный запрос .. но я хотите знать, есть ли эффективный способ заставить оператор SQL возвращать следующее в одном запросе?

Month Year Department Count(Transactions) Count(Transactions of ProductType1) 

ответ

3

Вы были очень близки, вам нужно добавить еще COUNT, но используя CASE выражение:

SELECT YEAR(T.TransactionDate) AS [YEAR], 
     MONTH(T.TransactionDate) AS [MONTH], 
     COUNT(T.Id) AS Transactions, 
     SUM(CASE WHEN P.ProductType = 1 THEN 1 ELSE 0 END) AS TransactionsType1 
FROM [Transaction] T 
INNER JOIN Product P 
    ON P.Id = T.ProductId 
GROUP BY T.DepartmentId, YEAR(T.TransactionDate), MONTH(T.TransactionDate); 
+0

Спасибо! Решение легко – CodeNinja

+0

Не могли бы вы рассказать мне, что мне нужно сделать, если я хочу добавить ключевое слово DISTINCT в SUM, я ищу, чтобы найти отдельные продукты. – CodeNinja

+0

@SQL Я думаю, что 'DISTINCT' может существенно изменить ответ, поэтому я рекомендую вам задать другой вопрос, если вы хотите получить лучший ответ для своей ситуации. – Lamak

2

Вы также можете использовать функцию PIVOT, чтобы получить результат:

select month, year, 
    departmentid, totalTransactions, 
    [1] ProductType1, 
    [2] ProductType2 
from 
(
    select month(t.transactiondate) month, 
    year(t.transactiondate) year, 
    t.departmentid, 
    p.productType, 
    count(*) over(partition by month(t.transactiondate), 
           year(t.transactiondate), 
           t.departmentid) totalTransactions 
    from [transaction] t 
    inner join Product p 
    on p.id = t.productid 
) s 
pivot 
(
    count(productType) 
    for productType in ([1], [2]) 
) piv; 

См. SQL Fiddle with Demo

+0

Благодарим за решение. Эта версия работает и для меня. – CodeNinja

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