Сложный SQL-запрос для ShoppingCart - PullRequest
0 голосов
/ 16 февраля 2010

Я пытался выяснить, как запросить базу данных корзины покупок, чтобы найти все заказы, которые содержат материальные предметы (предметы могут быть загружаемыми, следовательно, не отправлены), которым не был присвоен ярлык отслеживания 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

Ответы [ 2 ]

1 голос
/ 16 февраля 2010

Вы можете сделать это, используя предложение HAVING. В MySQL это выдает что-то вроде:

SELECT 
  c.OrderID,
  SUM(c.Quantity) AS tangible_products_number,
  SUM(s.QuantityInShipment) as shipped_items_number
FROM
( 
  Inventory i,
  ShoppingCart c
)
LEFT JOIN
  ShippedItems s
ON
  c.OrderID = s.OrderID
WHERE
  i.ProductID = c.ItemID AND
  i.IsDOwnloadable = 0 AND
  c.OrderID = t.OrderID AND
  s.CartID = c.ID
GROUP BY
  c.OrderID
HAVING
  SUM(c.Quantity) > SUM(s.QuantityInShipment)

Группу по синтаксису, вероятно, нужно будет адаптировать для SQL-сервера

0 голосов
/ 16 февраля 2010

Можете ли вы запросить dbo.Tracking, где TrackingNumber равен нулю?Это даст вам необходимую информацию?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...