Форум: "Базы";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];
ВнизЗапрос с вычислимым полем (?) Найти похожие ветки
← →
Галинка © (2008-01-31 13:07) [0]База Борей. Пробую сделать запрос типа "Оборот молочных продуктов" - т.е. какая фирма на сколько купила молочки.
Пока сообразила только сапрос, чтобы посмотреть, кто что вообще заказывал:SELECT Cust.CompanyName, Prod.ProductName FROM (((Customers AS Cust";
LEFT JOIN Orders AS Ord ON Cust.CustomerId = Ord.CustomerId)
LEFT JOIN [Order Details Extended] AS Ordd ON Ord.OrderId = Ordd.OrderId)
LEFT JOIN Products AS Prod ON Ordd.ProductId = Prod.ProductId)
LEFT JOIN Categories AS Ctg ON Prod.CategoryId = Ctg.CategoryId
WHERE Ctg.CategoryName = "Dairy Products"";
теперь бы надо получить поле умножением количества заказанного товара помноженного на цену. Первое хранится в таблице Order Details, второе в Products. А потом сложить в приделах заказа одной фирмы.
Подъемно ли это?
← →
clickmaker © (2008-01-31 13:26) [1]
> Подъемно ли это?
нет, конечно. Тут Оракл нужен, как минимум.
шутка.
А в чем проблема? sum(), group by, умножение...
← →
Галинка © (2008-01-31 13:37) [2]clickmaker © (31.01.08 13:26) [1]
ага. Вычитала уже у Виеры.
Тоолько вот не поняла, если группировать по нескольким полям, то как оно выглядет?
← →
Palladin © (2008-01-31 13:42) [3]ну сгруппируй да посмотри
← →
Галинка © (2008-01-31 14:38) [4]едем дальше.
Есть комбосписок, в котором отражаем названия продуктов. Есть просто список, в котором надо бы отражать список компаний, которые данный продукт покупали.
Сейачс пока сделалаcombobox1.DataSource=<query>;
combobox1.DisplayMember = <query>.Columns[1].ToString(); //соответствует query.ProductName
разумеется он мне показывает все насквозь. Как бы сделать так, чтоб продукты шли без повторов. Новый запрос? Фильтр в самом комбо?
← →
Павел Калугин © (2008-01-31 17:08) [5]> [4] Галинка © (31.01.08 14:38)
> Как бы сделать так, чтоб продукты шли без повторов
1. тупо в лоб select distinct
2. select product_name ... group by product_name
3. подумать и брать перечень продуктов из справочника продуктов где они уникальны
← →
Галинка © (2008-01-31 18:13) [6]
> Павел Калугин © (31.01.08 17:08) [5]
>
> > [4] Галинка © (31.01.08 14:38)
> > Как бы сделать так, чтоб продукты шли без повторов
>
> 1. тупо в лоб select distinct
> 2. select product_name ... group by product_name
еще один запрос делать не хоцца. Уже есть один монстр.
> 3. подумать и брать перечень продуктов из справочника продуктов
> где они уникальны
вот эт прально. Буду логику придумывать )) Другую.
ПыСы: а разумно ли в локальный НД все таблички из бд перегрузить?
← →
Галинка © (2008-01-31 18:13) [7]Ребят, а вообще СПАСИБО ВАМ ВСЕМ БОЛЬШОЕ. С Вами хорошо )))
← →
Palladin © (2008-01-31 18:16) [8]хитрое... резервирует ответ для следующего вопроса... :)
← →
Павел Калугин © (2008-01-31 18:18) [9]если продуктов много то не комбобокс а открывать в окне с фильтром выбирать и подставлять
то есть поле с кнопочкой по кнопке жмешь открылась форма с флоьтром выбрал что надо ок нажал или даблкликнул параметр подставился.
если мало то комбобоксы листбоксы и так далее
а перечень основной собирать запросом с учетом параметров фильтра
← →
Галинка © (2008-01-31 18:18) [10]я просто хотела именно JOIN потренировать. Но теперь понятно, что это не самый лучший выход. Надо как то по-другому опрос делать.
← →
Галинка © (2008-01-31 18:21) [11]кстати мой аггрегатный запросец теперь просто монстр:
cmd = new SqlCommand();
cmd.CommandText = "SELECT Cust.CompanyName, Ordd.ProductName, SUM(Ordd.Quantity) AS Quantity, SUM(Ordd.UnitPrice*Ordd.Quantity) AS OrderPrice, COUNT(*) AS OrdersCount FROM (((Customers AS Cust";
cmd.CommandText += " LEFT JOIN Orders AS Ord ON Cust.CustomerId = Ord.CustomerId)";
cmd.CommandText += " LEFT JOIN [Order Details Extended] AS Ordd ON Ord.OrderId = Ordd.OrderId)";
cmd.CommandText += " LEFT JOIN Products AS Prod ON Ordd.ProductId = Prod.ProductId)";
cmd.CommandText += " LEFT JOIN Categories AS Ctg ON Prod.CategoryId = Ctg.CategoryId";
cmd.CommandText += " WHERE Ctg.CategoryName = "Dairy Products"";
cmd.CommandText += " GROUP BY Cust.CompanyName, Ordd.ProductName";
cmd.Connection = conn;
label1.Text = cmd.CommandText;
← →
Palladin © (2008-01-31 18:21) [12]join тренировать не нужно, тренировать нужно его разновидности типа outer
бо left join делается без всяких left join"ов от чего запрос становится мягким и прозрачным как... стекло...
← →
Галинка © (2008-01-31 18:24) [13]Palladin © (31.01.08 18:21) [12]
пасиб за рекомендацию )) почитаю.
← →
Johnmen © (2008-01-31 21:02) [14]
> Галинка © (31.01.08 18:21) [11]
> кстати мой аггрегатный запросец теперь просто монстр:
Я даже предполагаю, что и результаты он неверные предоставляет...
← →
ЮЮ © (2008-02-05 04:25) [15]> кстати мой аггрегатный запросец теперь просто монстр:
>GROUP BY Cust.CompanyName, Ordd.ProductName
Смеешься? Я бы вместо того чтобы лепить с головы, сделал бы ещё более "монстроидальный", но зато шустрый запрос:DECLARE @CategoryName varchar(255)
SET @CategoryName = "Dairy Products"
SELECT
Cust.CompanyName, Ordd.ProductName, Quantity, OrderPrice, OrdersCount
FROM
(
SELECT
Ord.CustomerId, Ordd.ProductId,
COUNT(DISTINCT Ord.OrderId) OrdersCount, SUM(Quantity) Quantyty, SUM(OrderPrice) OrderPrice
FROM
(
SELECT
Ordd.OrderId, Ordd.ProductId,
SUM(Ordd.Quantity) Quantyty, SUM(Ordd.UnitPrice * Ordd.Quantity) OrderPrice, COUNT(*) OrdersCount
FROM
[Order Details Extended] AS Ordd
JOIN Products AS Prod ON Ordd.ProductId = Prod.ProductId
JOIN Categories AS Ctg ON (Prod.CategoryId = Ctg.CategoryId) AND (Ctg.CategoryName = @CategoryName)
GROUP BY Ordd.OrderId, Ordd.ProductId
) Ordd
JOIN Orders AS Ord ON Ordd ON Ord.OrderId = Ordd.OrderId
GROUP BY
Ord.CustomerId, Ordd.ProductId
) Ord
JOIN Customers Cust ON Cust.CustomerId = Ord.CustomerId
JOIN Products AS Prod ON Ord.ProductId = Prod.ProductId
А затем засунул бы бОьшую, но легкую часть в UDF и наслаждался бы остатком:SELECT
Cust.CompanyName, Prod.ProductName, Quantity, OrderPrice, OrdersCount
FROM
dbo.CategoryTotals("Dairy Products") t
JOIN Customers Cust ON Cust.CustomerId = t.CustomerId
JOIN Products AS Prod ON Prod.ProductId = t.ProductId
или, как в твоем случае,SELECT
Cust.CompanyName, Prod.ProductName, Quantity, OrderPrice, OrdersCount
FROM
Customers Cust
LEFT JOIN dbo.CategoryTotals("Dairy Products") t ON Cust.CustomerId = t.CustomerId
LEFT JOIN Products AS Prod ON Prod.ProductId = t.ProductId
← →
ЮЮ © (2008-02-05 04:44) [16]P.S. Запрос набирал в DMClient-е, с первого раза может и не запуститься :)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c