Şu anda çevrimdışısınız; İnternet'in yeniden bağlanması bekleniyor

Nasıl yapılır: dinamik olarak da bir Transact-SQL SELECT deyimi içinde satır numarası

ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.

Makalenin İngilizcesi aşağıdaki gibidir:186133
Özet
Bu makalede, bir SELECT deyimi gerçekleştirdiğinizde, yalnızca olası çözüm olabilir ve yordam çözümü hızlıdır olmadığı esnek bir yöntem kullanılarak dinamik olarak satır rütbe açıklamaktadır. Numaralandırma veya derecelendirmesi satır tipik bir yordam sorundur. Çözümleri genellikle döngüleri ve geçici tablolar temel alır; bu nedenle, SQL Server'da dayalı döngüleri ve imleç. Bu teknik, bir otomatik birleştirme işlemini temel alır. Seçili ilişkiyi genellikle. "büyüktür." Count her öğe, belirli bir veri kümesi ilişki karşılayan kaç kez "ne zaman büyüktür" belirlenen kendisine karşılaştırılır.

Not Aşağıdaki örnek, pubs veritabanı temel alır. Varsayılan olarak, Northwind örnek veritabanındaki ve pubs örnek veritabanı SQL Server 2005'te yüklü değil. Bu veritabanlarını Microsoft Yükleme Merkezi'nden yüklenebilir. Daha fazla bilgi için aşağıdaki Microsoft Web sitesini ziyaret edin:SQL2000SampleDb.msi karşıdan yüklendikten sonra örnek veritabanı komut dosyalarını SQL2000SampleDb.msi ek Yardım düğmesini tıklatarak ayıklayın. Varsayılan olarak, SQL2000SampleDb.msi veritabanı komut dosyalarını ve bir Benioku dosyası aşağıdaki klasöre ayıklayacaksınız:
C:\SQL Server 2000 örnek veritabanları
Yükleme komut dosyalarını çalıştırmak için ilgili bültenin readme dosyasında yönergeleri izleyin.

SQL Server 2005 kullanıyorsanız

SQL Server 2005'te yeni bir özellik olarak sunulan derecelendirmesini işlevleri kullanmanız önerilir. Derecelendirme işlevleri hakkında daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitesini ziyaret edin:back to the top

Örnek 1

Bu örnekte:
  • 1 Yazarlar kümesidir.
  • 2 Yazarlar kümesidir.
  • Bir ilişki vardır "son ve ilk büyük adlardır."
  • Diğer ilk + son adları için ilk + son adları karşılaştırarak, yinelenen sorunu önleyebilirsiniz.
  • Ilişki count(*) tarafından yerine getirilir sayısını sayar.
Sorgu:
   select rank=count(*), a1.au_lname, a1.au_fname   from authors a1, authors a2   where a1.au_lname + a1.au_fname >= a2.au_lname + a2.au_fname   group by a1.au_lname, a1.au_fname   order by rank				
SQL Server 2005'te şu kodu kullanın.
   select rank() OVER (ORDER BY a.au_lname, a.au_fname) as rank, a.au_lname, a.au_fname   from authors a   order by rank 
sonucu:
   Rank        Au_Lname              Au_Fname   ----        --------------        -----------     1         Bennet                Abraham     2         Blotchet-Halls        Reginald     3         Carson                Cheryl     4         DeFrance              Michel     5         del Castillo          Innes     6         Dull                  Ann     7         Greene                Morningstar     8         Green                 Marjorie     9         Gringlesby            Burt    10         Hunter                Sheryl    11         Karsen                Livia    12         Locksley              Charlene    13         MacFeather            Stearns    14         McBadden              Heather    15         O'Leary               Michael    16         Panteley              Sylvia    17         Ringer                Albert    18         Ringer                Anne    19         Smith                 Meander    20         Straight              Dean    21         Stringer              Dirk    22         White                 Johnson    23         Yokomoto              Akiko   (23 row(s) affected)				
back to the top

Örnek 2

Bu örnekte:
  • Rütbe depoları kitapların sayısı ile satılan.
  • <a1>Set</a1> 1 deposu tarafından satılan defterleri sayısıdır: stor_id, qty=sum(qty) stor_id göre satış grubu seçin.
  • <a1>Set</a1> 2 deposu tarafından satılan defterleri sayısıdır: stor_id, qty=sum(qty) stor_id göre satış grubu seçin.
  • "Kitapların sayısı büyüktür." ilişkisidir
  • Çoğaltmaları önlemek için <a0></a0>, fiyatı (örneğin) karşılaştırabilirsiniz * miktar, Mkt.
Sorgu:
   select rank=count(*), s1.stor_id, qty=sum(s1.qty)   from (select stor_id, qty=sum(qty) from sales group by stor_id) s1,        (select stor_id, qty=sum(qty) from sales group by stor_id) s2   where s1.qty >= s2.qty   group by s1.stor_id   order by rank				
sonucu:
   Rank     Stor_Id    Qty   ----     -------    ---   1         6380        8   2         7896      120   3         8042      240   4         7067      360   5         7066      625   6         7131      780   (6 row(s) affected)				
Not <a0>Miktar</a0> sütunundaki değerleri yanlıştır. Ancak, kitap Satılan miktar, temel depolarının derecelendirmesini doğrudur. Bu yöntemin bir hatası budur. Yanlış sonuç miktarı hakkında dikkate depolarının derecelendirmesini dönün, bu yöntemi kullanın.

SQL Server 2005'te şu kodu kullanın.
select row_number() over (order by qty desc) as rank,s1.stor_id,s1.qtyfrom (select stor_id, qty=sum(qty) from sales group by stor_id) as s1
sonucu:
rank     stor_id  qty-------  -------  ------1        7131     1302        7066     1253        7067     904        8042     805        7896     606        6380     8(6 row(s) affected)
derecelendirmesini işlevlerini kullandığınızda, SQL Server 2005'te Not, derecelendirmesini ve miktarı doğru sonucu alabilir.

back to the top

Örnek 3

Bu örnekte:
  • Yayımcılar tarafından kendi kazançlarını rütbe.
  • 1 Yayımcı tarafından toplam satışların kümesidir:
            select t.pub_id, sales=sum(s.qty*t.price)        from sales s, titles t        where s.title_id=t.title_id          and t.price is not null        group by t.pub_id					
  • 2 Yayımcı tarafından toplam satışların kümesidir:
            select t.pub_id, sales=sum(s.qty*t.price)        from sales s, titles t        where s.title_id=t.title_id          and t.price is not null        group by t.pub_id					
  • "'Den daha fazla para kazandırır." ilişkisidir
Sorgu:
   select rank=count(*), s1.pub_id, sales=sum(s1.sales)   from    (select t.pub_id, sales=sum(s.qty*t.price)           from sales s, titles t           where s.title_id=t.title_id             and t.price is not null           group by t.pub_id) s1,           (select t.pub_id, sales=sum(s.qty*t.price)           from sales s, titles t           where s.title_id=t.title_id             and t.price is not null           group by t.pub_id) s2   where s1.sales>= s2.sales   group by s1.pub_id   order by rank				
sonucu:
   Rank     Pub_Id   Sales   ----     ------   --------   1         0736    1,961.85   2         0877    4,256.20   3         1389    7,760.85   (3 row(s) affected)				
NotSatış sütunundaki değerler yanlıştır. Ancak, üzerinde kazançlarını temel yayımcılar derecelendirmesini doğrudur.

Aşağıdaki kod, SQL Server 2005'te kullanın.
select rank() over (order by sales desc) as rank,s1.pub_id,s1.sales from (select t.pub_id, sales=sum(s.qty*t.price)     from sales s inner join titles t     on s.title_id=t.title_id     where  t.price is not null     group by t.pub_id) as s1
Sonuç:
rank     pub_id  sales-------  ------  ---------1        1389    2586.952        0877    2128.103        0736    1961.85(3 row(s) affected)				
Not derecelendirmesini ve derecelendirmesi işlevlerini kullandığınızda getirisi doğru sonucu alırsınız.

back to the top

Dezavantajları

  • Çapraz birleştirme nedeniyle, bu çok sayıda satır çalışmak üzere tasarlanmamıştır. Iyi satır yüzlerce çalışır. Büyük tablolarda, büyük taramaları önlemek için bir dizin kullandığınızdan emin olun.
  • Yinelenen değerler ile iyi çalışmaz. Yinelenen değerleri karşılaştırmak, kesintili satır numaralandırması oluşuyor. Bu durumda <a0></a0> değilse istediğiniz davranışı, onu bir elektronik tabloda sonucu eklediğinizde, rütbe sütun gizleyerek önleyebilirsiniz; bunun yerine numaralandırma elektronik tablo kullanın.

    Not SQL Server 2005 kullanıyorsanız, row_number() işlevi, sıralı yinelenen satırları ne olursa olsun, bir satır sayısını döndürmek için kullanabilirsiniz.
Example:
   select rank=count(*), s1.title_id, qty=sum(s1.qty)   from (select title_id, qty=sum(qty) from sales group by title_id) s1,        (select title_id, qty=sum(qty) from sales group by title_id) s2   where s1.qty >= s2.qty   group by s1.title_id   order by rank
Result:
   Rank    Title_Id    Qty   ----    --------    ----   1       MC2222        10   4       BU1032        60   4       BU7832        60   4       PS3333        60   7       PS1372       140   7       TC4203       140   7       TC7777       140   10      BU1111       250   10      PS2106       250   10      PS7777       250   11      PC1035       330   12      BU2075       420   14      MC3021       560   14      TC3218       560   15      PC8888       750   16      PS2091      1728   (16 row(s) affected)				
back to the top

Avantajlar

  • Bu görünümler ve sonucu biçimlendirme sorgularda kullanabilirsiniz.
  • Alt olduklarına verilerin daha fazla sağa kaydırma.
Örnek 1:
   CREATE VIEW v_pub_rank   AS   select rank=count(*), s1.title_id, qty=sum(s1.qty)   from (select title_id, qty=sum(qty) from sales group by title_id) s1,        (select title_id, qty=sum(qty) from sales group by title_id) s2   where s1.qty >= s2.qty   group by s1.title_id				
Query:
   select  publisher=convert(varchar(20),replicate (' ', power(2,rank)) +           pub_id +           replicate(' ', 15-power(2,rank))+': '),           earnings=qty   from v_pub_rank				
sonucu:
   Publisher       Earnings   -------------   --------     0736          : 1,961.85       0877        : 4,256.20           1389    : 7,760.85				
SQL Server 2005'te şu kodu kullanın.
CREATE VIEW v_pub_rankASselect rank() over (order by sales) as rank,s1.pub_id,s1.sales 	from (select t.pub_id, sales=sum(s.qty*t.price)	from sales s, titles t	where s.title_id=t.title_id	and t.price is not null	group by t.pub_id) as s1GOselect  publisher=convert(varchar(20),replicate (' ', power(2,rank)) +	pub_id + replicate(' ', 15-power(2,rank))+': '),	earnings=salesfrom v_pub_rank order by rankGO
sonucu:
publisher            earnings-------------------- ---------------------  0736             : 1961.85    0877           : 2128.10        1389       : 2586.95(3 row(s) affected)

Örnek 2:
   CREATE VIEW v_title_rank   AS   select rank=count(*), s1.title_id, qty=sum(s1.qty)   from (select title_id, qty=sum(qty) from sales group by title_id) s1,        (select title_id, qty=sum(qty) from sales group by title_id) s2   where s1.qty >= s2.qty   group by s1.title_id				
Query:
   select  Book=convert(varchar(45),replicate (' ', 2*rank) +           title_id +           replicate(' ', 35-2*rank)+': '),           qty   from v_title_rank   order by rank				
sonucu:
   Book                                          Qty   -------------------------------------------   ----     MC2222                                 :      10           BU1032                           :      60           BU7832                           :      60           PS3333                           :      60                 PS1372                     :     140                 TC4203                     :     140                 TC7777                     :     140                       BU1111               :     250                       PS2106               :     250                       PS7777               :     250                         PC1035             :     330                           BU2075           :     420                               MC3021       :     560                               TC3218       :     560                                 PC8888     :     750                                   PS2091   :    1728   (16 row(s) affected)				
SQL Server 2005'te şu kodu kullanın.
CREATE VIEW v_title_rankASselect rank() over (order by qty) as rank, s1.title_id,s1.qtyfrom (select title_id, qty=sum(qty) from sales group by title_id) as s1GOselect Book=convert(varchar(45),replicate (' ', 2*rank) +title_id + replicate(' ', 35-2*rank)+': '), qtyfrom v_title_rankorder by rankGO
sonucu:
Book                                          qty--------------------------------------------- -----------  MC2222                                 :    10    BU1032                               :    15    BU7832                               :    15    PS3333                               :    15          TC4203                         :    20          TC7777                         :    20          PS1372                         :    20                BU1111                   :    25                PS7777                   :    25                PS2106                   :    25                      PC1035             :    30                        BU2075           :    35                          MC3021         :    40                          TC3218         :    40                              PC8888     :    50                                PS2091   :    108(16 row(s) affected) 
back to the top
prodsql birleştirme rütbe biçimlendirme sorgusu

Uyarı: Bu makalenin çevirisi otomatik olarak yapılmıştır

Özellikler

Makale No: 186133 - Son İnceleme: 02/14/2006 08:04:53 - Düzeltme: 5.4

Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 4.21a Standard Edition, Microsoft SQL Server 6.0 Standard Edition, Microsoft SQL Server 6.5 Standard Edition, Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL 2005 Server Enterprise, Microsoft SQL Server 2005 Express Edition, Microsoft SQL 2005 Server Workgroup

  • kbmt kbhowtomaster KB186133 KbMttr
Geri bildirim