Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.49 MB
Время: 0.007 c
3-1201857058
Son_of_Morning
2008-02-01 12:10
2008.07.13
Помогите определится с выбором СУБД


15-1211832869
Nic
2008-05-27 00:14
2008.07.13
adobe acrobat reader 64 bit


2-1213024171
Franzy
2008-06-09 19:09
2008.07.13
Как узнать статус завершения запущенной консольной программы?


15-1208540966
Loginov Dmitry
2008-04-18 21:49
2008.07.13
Полезный глюк :)


2-1213120133
Riply
2008-06-10 21:48
2008.07.13
Warning, которого быть не должно.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский