2014-12-18 2 views
0

Допустим, что у вас есть две таблицы, [Продукты] и [Quantiy].Подкаталог SQL Columns с различными критериями

Мне нужно выбрать соединение для того, чтобы построить таблицу с общим количеством на продукт. Я знаю, кто это сделает в ванильном соединении. Моя проблема в том, что мне нужно 3 столбца один [PreviewTotal], где я должен был бы иметь это общее количество с тех пор, пока не было ни одного знака количества других [TodaytotalPos] с количеством на сегодня и положительным и другим [TodaytotalNeg] только сегодня и отрицательным.

результат как:

[Products] [PreviewTotal] [TodaytotalPos] [TodaytotalNeg] 

AAPL   20,000   500    -700 

MCD   15,000   NULL   -300 

BAC   -30,000   2,000   NULL 

Образец структуры: Producst:

[id] [name] 
1  AAPL 
2  MCD 
3  BAC 

Количество:

[date] [Id_Product] [Quantity] 
12/16   1   500 
12/16   2   -300 
12/17   1   1,000 
12/18   3   5,500 
12/18   1   -2,000 
+1

Не могли бы вы предоставить структуру стола для продуктов и количества? –

+0

предоставить некоторые данные образца с нужным результатом из этого ... –

+0

Какую базу данных вы используете? –

ответ

0

на основе правил, которые вы укажете, я думаю, вы просто ищете для условной агрегации. Ваш запрос будет выглядеть примерно так:

select p.name, 
     sum(case when [date] < cast(getdate() as date) then quantity end) as PreviewTotal, 
     sum(case when [date] = cast(getdate() as date) and quantity > 0 
       then quantity end) as TodayTotalPos, 
     sum(case when [date] = cast(getdate() as date) and 
       quantity < 0 then quantity end) as TodayTotNeg 
from products p join 
    quantity q 
    on q.id_product = p.id 
group by p.name 
order by p.name; 

Однако желаемые результаты не соответствуют входным данным на основе этих правил.

+0

работает отлично, спасибо. Еще одна вещь, этот выбор является частью объединения. и конец всего, что я хочу, не показывать строку, если все эти три подсчитанных столбца имеют нулевое значение. Поскольку я использую SELECT/JOIN, я думаю, что я должен использовать HAVING, но он не признает эти 3 столбца в качестве аргумента. – Flib

+0

игнорировать, только что понятый, если все NULL, он не включает строку по умолчанию. – Flib

0

В SQL Server вы можете использовать CASE для выбора значения поля, если условие истинно или ложно. Я предполагаю, что ваша таблица [Products] содержит по крайней мере ProductId и ProductName, а ваша таблица [Quantity] содержит как минимум ProductId, Qty и SoldDate.

-- get the time of midnight, the start of today: 
DECLARE Today datetime; 
SELECT DATEADD(DAY, DATEDIFF(DAY, '19000101', GETDATE()), '19000101') INTO Today 

-- get the totals 
SELECT Products.ProductName, 
    SUM(
     CASE 
     WHEN Quantity.SoldDate >= Today THEN Quantity.Qty 
     ELSE 0 
     END) AS PreviewTotal, 
    SUM(
     CASE 
     WHEN Quantity.Qty> 0 AND Quantity.SoldDate >= Today) THEN Quantity.Qty 
     ELSE 0 
     END) AS TodaytotalPos, 
    SUM(
     CASE 
     WHEN Quantity.Qty< 0 AND Quantity.SoldDate >= Today THEN Quantity.Qty 
     ELSE 0 
     END) AS TodaytotalNeg 
FROM Products JOIN Quantity on Products.ProductId = Quantity.ProductId 
GROUP BY ProductName 
+0

Спасибо вам за помощь – Flib

+0

Он работает одинаково для UDF? – Flib

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