Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.13;
Скачать: CL | DM;

Вниз

Запрос с вычислимым полем (?)   Найти похожие ветки 

 
Галинка ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
2-1213098806
ciborg
2008-06-10 15:53
2008.07.13
TComboBox только для чтения


2-1213285768
ivan8511
2008-06-12 19:49
2008.07.13
Индекс в обратном порядке


2-1213080987
андр.
2008-06-10 10:56
2008.07.13
MS SQL 2000


2-1213535300
NieL
2008-06-15 17:08
2008.07.13
Скорость работы алгоритма


3-1202115145
Tsyba_Stanislav
2008-02-04 11:52
2008.07.13
Проблема возврата строк в запросе под ОС Виста