Я пытался выяснить, как запросить базу данных корзины покупок, чтобы найти все заказы, которые содержат материальные предметы (предметы могут быть загружаемыми, следовательно, не отправлены), которым не был присвоен ярлык отслеживания UPS. Я не смог этого сделать.
Включены следующие таблицы:
// dbo.Inventory - details about the individual product being sold
- ProductID int primary - Name nvarchar - IsDownloadable bit -
| 5 | Awesome Shirt | 0 |
| 7 | An Audio Track | 1 |
// dbo.ShoppingCart --("ShopID" groups the items in the cart)
- CartID int primary - ProductID int - ShopID char (guid) - Quantity int -
| 2 | 5 | e854a982c9264a72 | 4 |
| 3 | 7 | e854a982c9264a72 | 1 |
// dbo.Orders - Order information (shipping address, etc)
- OrderID int primary - ShopID char(x) - BillingInfoColumns -
| 13 | e854a982c9264a72 | Name,Address,etc |
// dbo.Tracking - Shipments' (note: a shipment can contain several items) tracking numbers
- TrackingID int primary - OrderID int - TrackingNumber char(x) -
| 5 | 13 | Ze5Whatever... |
// dbo.ShippedItems - Maps a ShoppingCart's shipped items to tracking numbers
- ShippingID int primary - TrackingID int - CartID int - QuantityInShipment int
| 6 | 5 | 2 | 3 |
Надеюсь, вышеизложенное дает разумное представление о том, как устроена БД.
Итак, чтобы уточнить, что я думаю мне нужно:
ВЫБЕРИТЕ все идентификаторы заказа, для которых НЕ были доставлены ВСЕ материальные товары.
Нематериальные объекты IsDownloadable = 1
Необходимо учитывать столбец ShoppingCart.Quantity. Если мы заказываем 4 футболки, мы можем положить их в одну коробку (с одной этикеткой для отслеживания UPS). Опять же, мы можем поставить 2 за коробку. Или мы можем положить одну пару джинсов с одной рубашкой в одну и ту же коробку (опять же, с одной этикеткой для отслеживания) ... и т. Д.
Я придумывал дерьмо с бесконечными СОЕДИНЕНИЯМИ и вложенными ГДЕ НЕ В (ВЫБРАТЬ * ИЗ) s безрезультатно. К сожалению, я не могу обернуть голову вокруг этого ... Я все еще жду своего момента Эврики.
Я относительно новичок в SQL и проектировании баз данных, поэтому любая информационная или (конструктивная) критика будет принята с благодарностью. Не стесняйтесь делать пробелы в дизайне самой базы данных, если вы думаете, что это поможет. : -)
// I wish I could run this on my brain right now...
// (Neurons, apparently, are "excitable")
UPDATE Brain SET Neuron = 'Excited' WHERE Cortex = 'SQL'
UPDATE
Вот что я придумал благодаря Бенуа Видису. Это фактический запрос, который я использую для своих реальных таблиц / данных:
SELECT
d.OrderID
FROM
Person.ShoppingCart c
JOIN
Inventory.Item i
ON
i.ItemID = c.ItemID
JOIN
Orders.Details d
ON
d.ShopID = c.ShopID
LEFT JOIN
Orders.Shipping s
ON
d.OrderID = s.OrderID
LEFT JOIN
Orders.ShippedItems si
ON
s.ShippingID = si.ShippingID
WHERE
i.DownloadableMedia = 0 AND
d.Billed = 1 AND
d.Ordered = 1
GROUP BY
d.OrderID
HAVING
SUM(c.Quantity) > CASE WHEN SUM(si.Quantity) IS NULL THEN 0 ELSE SUM(si.Quantity) END