2016-03-21 24 views
0

Aşağıdaki soruları cevaplayacak sorguyu çalıştırmaya çalışıyorum: "Mayıs 2004'te hangi miktarlarda sipariş verildi?" her ürün azalan düzende "Ürünlerime göre sql deyimimi sıralamak nasıl raporlandırılır

Şimdiye kadar, Mayıs 2004'te sipariş edilen tüm ürünlerin listesini başarıyla aldım. Ancak, her ürün için nasıl sıralayacağımı bilmiyorum. Ifade tarafından bir grup denedim (PRODUCTNAME grubu) ve "GROUP GROUP ifadesiyle değil" ("GROUP BY PRODUCTNAME" grubunu aşağıdaki çalışma sorgusunun sonuna ekledim) hatası aldım.)

İşte çalışma sorgusu Bu noktaya kadar var: Ben sorguda bu kısmını gerçekleştirmek nasıl: Output from working query above

yüzden soru şudur:

İşte
SELECT ORDERS.ORDERNUMBER, PRODUCTS.PRODUCTNAME, ORDERS.SHIPPEDDATE 
FROM ORDERS, 
    PRODUCTS 
WHERE SHIPPEDDATE LIKE '%MAY-04'; 

benim çıktısının bir görüntü? Ardından bir GROUP BY eklemek birleşimler uygun do hepsinden

+1

Bu sonuç muhtemelen istediğiniz gibi değil - JOIN koşuluna ihtiyacınız var! – jarlh

+0

Ben sql için yeni ve kendimi öğretmeye çalışıyorum. Daha iyi bir yol biliyorsanız, daha iyi bir sorguyu yorumlamak veya göndermek için çekinmeyin. Ben en yeni başlayanlardanım! lol – Kleigh

+0

SHIPPEDDATE bir dize (varchar2) veya uygun bir tarih sütunu mu? Gerçekten bir tarih olmalı ve tarihler için filtreleme yapmanın daha iyi yolları var. Şu anda bir dizeye dolaylı olarak dönüştürüyorsunuz ve bir eşleşme bulmak için oturumunuzun NLS_DATA_FORMAT ayarlarına güveniyorsunuz. –

cevap

2

İlk "nicelik Rapor azalan sırada her bir ürün için sıralanır sipariş":

SELECT o.ORDERNUMBER, p.PRODUCTNAME, SUM(od.quantity) 
FROM ORDERS o 
    JOIN order_details od ON o.ORDERNUMBER= od.ORDERNUMBER 
    JOIN PRODUCTS p ON od.ProductCode = p.ProductCode 
WHERE SHIPPEDDATE LIKE '%MAY-04' 
GROUP BY o.ORDERNUMBER, p.PRODUCTNAME 

Ben çok iyi Oracle bilmiyorum ama sana herhalde Gordon Linoff yanıtında olduğu gibi,

WHERE YEAR(SHIPPEDDATE) = 2004 and MONTH(SHIPPEDDATE) = 5 

gibi bir şey Ya olabilir

WHERE SHIPPEDDATE >= DATE '2004-05-01' AND SHIPPEDDATE < DATE '2004-06-01' 
+0

Bu yüzden kafam karıştı. Ürün kimliği yok, bir "ProductCode" var ama bu kod sadece ürün tablosunda. Ürün tablosu ve sipariş tablosu, birleştirilecek sütunları paylaşmaz. – Kleigh

+1

@Kleigh - ORDERITEMS veya ORDERPRODUCTS gibi bunları birleştiren üçüncü bir tablo var mı? –

+0

Sipariş tablosunda hiç Ürün Kodu yok mu? – jarlh

3
SELECT p.PRODUCTNAME, COUNT(*) 
FROM ORDERS o JOIN 
    PRODUCTS p 
    ON o.PRODUCTID = p.PRODUCTID 
WHERE o.SHIPPEDDATE >= DATE '2004-05-01' AND SHIPPEDDATE < DATE '2004-06-01' 
GROUP BY p.PRODUCTNAME; 

Notlar:

  • açık JOIN sözdizimi kullanmayı öğrenin istediğinizsorgu şuna benzer. Basit kural: AslaFROM maddesinde virgül kullanın. Her zamanJOIN kullanın.
  • Tarih karşılaştırmaları için, tarihler için yerleşik işlevleri ve operatörleri kullanın. Dizeleri gereksiz yere dönüştürmeyin.
  • Tarih sabitleri tercihim, Oracle'ın varsayılan biçiminden ziyade, ISO standart YYYY-AA-GG biçimidir.
  • Toplamaya ihtiyacınız var, ancak SELECT'dan ekstra sütunlar bırakın.
İlgili konular