2013-04-16 36 views
9

Bir emir görünümünden sipariş almaya çalışıyorum. Benim görüşüme göre, tam olarak aynı değerlere sahip bazı satırlarım var, ama bu değerleri orderid üzerinde gruplamak ve bu siparişin miktarının toplamını almak istiyorum.SQL Server - tek sütunta GROUP BY

gibi Bence sonuçları şey:

SELECT Order_id, Customer_id Article_id, Delivery_date, sum(Quantity) 
FROM Orders 
GROUP BY Order_id 

gibi bir şey almak için:

Order_id Customer_id Article_id Delivery_date Quantity 
--------------------------------------------------------------------------- 
PR10.001 11   20.001a  17-04-2013  1 
PR10.001 11   20.001a  17-04-2013  1 
PR10.001 11   20.001a  17-04-2013  1 
PR13.001 15   41.022b  19-04-2013  1 
PR13.001 15   41.022b  19-04-2013  1 

ben böyle bir şey yapmak istiyorum

Order_id Customer_id Article_id Delivery_date Quantity 
--------------------------------------------------------------------------- 
PR10.001 11   20.001a  17-04-2013  3 
PR13.001 15   41.022b  19-04-2013  2 

Ama tek tek gruplama biliyorum sütun mümkün değil, aksi takdirde iletiyi alırsınız:

[...], bir toplama işlevi veya GROUP BY yan tümcesi 'da bulunmadığından seçim listesinde geçersiz.

SQL Server'da belirli bir sütuna göre gruplandırmak için başka bir olasılık veya geçici çözüm var mı? diğer sütunları varsayarak

+0

, şimdi benim de mantığı, ama – Jovano

cevap

14

Şunları kullanabilirsiniz CTE sipariş grubundan istenen satır seçmek için ROW_NUMBER + SUM(Quantity)OVER(PARTITION BY Order_id) ile : Ancak

WITH cte 
    AS (SELECT order_id, 
       customer_id, 
       article_id, 
       delivery_date, 
       quantity=Sum(quantity) 
          OVER( 
          partition BY order_id), 
       rn = Row_number() 
         OVER( 
         partition BY order_id 
         ORDER BY delivery_date ASC) 
     FROM orders) 
SELECT order_id, 
     customer_id, 
     article_id, 
     delivery_date, 
     quantity 
FROM cte 
WHERE rn = 1 

DEMO

, istediğiniz sonucu yanlış (soru gibi görünüyor düzenlenmiş)

Bu benim durumum:

ORDER_ID CUSTOMER_ID ARTICLE_ID DELIVERY_DATE QUANTITY 
PR10.001 11   20.001a   17-04-2013 3 
PR13.001 15   41.022b   19-04-2013 2 
+0

ARTICLE_ID, her ORDER_ID için birden fazla olabilir, yukarıdaki CTE örneğinde ilk olarak seçilir, tam bir sonuç değildir. – harsh

+0

@harsh: OP, makaleyi de grubun istediği gibi bıraktığından bahsetmedi. Aksi takdirde ARTICLE_ID değerini 'PARTITION BY' öğesine ekleyebilir. –

+0

Her şeyden önce: Tim haklıdır, her siparişin sadece 1 tür makalesi olduğundan, Article_id grubuna göre gruplandırılması gerekli değildir. İkincisi, sanki sadece 1 grubu kullanmak mümkün olan MySQL ile çalışıyormuşsunuz gibi korkunç ve karmaşık bir çalışma, ama şimdi BÜYÜK çalışıyor! Size tüm krediler, teşekkürler! – Jovano

10

gruplama kolonu üzerinde işlevsel olarak bağlıdır, en basit cevap ya

bir bulunmaktadır. aynı zamanda diğer sütunlarla Grup:

SELECT Order_id, Customer_id, Article_id, Delivery_date, sum(Quantity) 
FROM Orders 
GROUP BY Order_id, Customer_id, Article_id, Delivery_date 

veya

b. max gibi bir toplama işlevi kullanın: Ben ilkinden daha nettir düşünüyorum

SELECT Order_id, max(Customer_id), max(Article_id), max(Delivery_date), sum(Quantity) 
FROM Orders 
GROUP BY Order_id 

Benim kişisel tercihi sadece gruplanmış ediliyor aksine hangi gibi öğeler aslında gruplama için gerekli olan belirtirken, ikinci yaklaşımdır gruplanmamış/ayrıştırılmamış sütun sorununu gidermek için.

+0

açık olmalıdır zaman yeni bir görünüm oluşturmaya çalışıyorum, bazı yeni problemler alıyorum: İlk çözümünüzde: "IS NULL veya LIKE operatörü kullanıldığında, metin, ntext ve resim veri türleri karşılaştırılamaz veya sıralanamaz." benim örneğimde yer almadığım bazı sütunlardan kaynaklanıyor. İkincisiniz, max() – Jovano

+0

@JorikvanOnna'yı desteklemeyen bazı varchar sütunlarım nedeniyle çalışmaz: Varchar sütunlarının her zaman "max" değerini desteklemesini beklerim, ancak zorunlu olarak metin, ntext veya resim veri türleri içermez. Bu sorunun nedeninin temel nedeni olduğu için, sorunuzu bu bilgileri içerecek şekilde güncellemenizi öneririz. Tim'in cevabı bu sınırlamayla bile işe yaramalı; Başka bir yaklaşım, gruplama sütunu tarafından gruplandırılmak ve bir satır içi görünümde/CTE'de toplanmış değeri içermek, ardından sorun sütunlarını içeren diğer tablolara katılmak olacaktır - bu, soruda daha fazla bilgi gerektirecektir. –

0

Senaryosunda, Article_id değişkenine sahip olan Order_id gruplamasında doğru görünmüyor. Beklenen sonuç yanlış görünüyor. Olmalıdır:

PR10.001 iki makale_kimligi 20.001a, 41.022b ve toplam miktarı 4 (değil 3)

beklentiniz çok o zaman gereken her ORDER_ID için toplam miktar ama istinat değişen sütun elde etmektir mı var beklenen sonuca karar vermek için?gibi bir şey:

Order_id Customer_id Article_id   Delivery_date Quantity 
--------------------------------------------------------------------------- 
PR10.001 11   20.001a, 41.022b  17-04-2013  4 
PR13.001 15   41.022b    19-04-2013  2 
+0

Beklediğim sonuç gerçekten yanlıştı, ama bunu düzenledim, şu anda olmalı – Jovano

0

Sizinle benzer bir tablo kullandım. isimleri hızlı bir şekilde test etmek için farklı jsu olacaktır. Lütfen aşağıdaki sorguya bakınız. İsimleri istediğiniz gibi değiştirin. CTE İLE

select ordid,customerid,articleid,SUM(cast(quantity as numeric)) quantity from test_stack group by ordid,customerid,articleid 
0

AS ( customer_id, article_id, DELIVERY_DATE, order_id SEÇ miktarı = Toplam (miktar) order_id İLE ÜZERİNDE ( bölüm), m = row_number() ÜZERİNDE ( partition order_id SİPARİŞ BY delivery_date ASC) BEDEN) SELECT order_id, customer_id, article_id, DELIVERY_DATE, CTE DAN miktar NEREDE rn = 1

benim örnekle şeylerin yanlış olduğunu, bunu üzgün editted ettik ediyorum