SORU
15 Ocak 2009, PERŞEMBE


Ve COUNT GROUP BY SQL kullanarak bu SERİ () FARKLI

Aşağıdaki SQL sorgu gerçekleştirmek için var:

select answer_nbr, count(distinct user_nbr)
from tpoll_answer
where poll_nbr = 16
group by answer_nbr

SQL sorgu için kontrol ETMENİZ

from a in tpoll_answer 
where a.poll_nbr = 16 select a.answer_nbr, a.user_nbr distinct 

aşağıdaki SQL sorgu için harita:

select distinct answer_nbr, distinct user_nbr
from tpoll_answer
where poll_nbr = 16

Şimdiye kadar, çok iyi. Ancak sorun yükseltir zaman çalışıyor GRUP sonuç olarak ben mümkün olmayan bir SERİ bulmak için SQL sorgusunu bu haritalar ilk sorgu yazdım burada (teşekkürler LINQPad yapmak için bu süreç çok daha kolay). Aşağıdaki benden istenen sonucu verir bulduğum tek kişi

from answer in tpoll_answer where answer.poll_nbr = 16 _
group by a_id = answer.answer_nbr into votes = count(answer.user_nbr)

Sırayla tüm SQL sorgu: aşağıdaki çirkin olan ve olmayan iyileştirilmiş üretir

SELECT [t1].[answer_nbr] AS [a_id], (
    SELECT COUNT(*)
    FROM (
        SELECT CONVERT(Bit,[t2].[user_nbr]) AS [value], [t2].[answer_nbr], [t2].[poll_nbr]
        FROM [TPOLL_ANSWER] AS [t2]
        ) AS [t3]
    WHERE ([t3].[value] = 1) AND ([t1].[answer_nbr] = [t3].[answer_nbr]) AND ([t3].[poll_nbr] = @p0)
    ) AS [votes]
FROM (
    SELECT [t0].[answer_nbr]
    FROM [TPOLL_ANSWER] AS [t0]
    WHERE [t0].[poll_nbr] = @p0
    GROUP BY [t0].[answer_nbr]
    ) AS [t1]
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [16]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1

Herhangi bir yardım daha takdir edilecektir.

CEVAP
16 Ocak 2009, Cuma


Yok doğrudan destek COUNT(DISTINCT {x})), ama taklit bir IGrouping<,> (yani ne group by verir); korkarım sadece "yap" C# çok zorundasın çevirmek için... VB

 select new
 {
     Foo= grp.Key,
     Bar= grp.Select(x => x.SomeField).Distinct().Count()
 };

İşte Northwind örnek:

    using(var ctx = new DataClasses1DataContext())
    {
        ctx.Log = Console.Out; // log TSQL to console
        var qry = from cust in ctx.Customers
                  where cust.CustomerID != ""
                  group cust by cust.Country
                  into grp
                  select new
                  {
                      Country = grp.Key,
                      Count = grp.Select(x => x.City).Distinct().Count()
                  };

        foreach(var row in qry.OrderBy(x=>x.Country))
        {
            Console.WriteLine("{0}: {1}", row.Country, row.Count);
        }
    }

TSQL istediğimiz şey çok değil, ama işimi görüyor:

SELECT [t1].[Country], (
    SELECT COUNT(*)
    FROM (
        SELECT DISTINCT [t2].[City]
        FROM [dbo].[Customers] AS [t2]
        WHERE ((([t1].[Country] IS NULL) AND ([t2].[Country] IS NULL)) OR (([t1]
.[Country] IS NOT NULL) AND ([t2].[Country] IS NOT NULL) AND ([t1].[Country] = [
t2].[Country]))) AND ([t2].[CustomerID] <> @p0)
        ) AS [t3]
    ) AS [Count]
FROM (
    SELECT [t0].[Country]
    FROM [dbo].[Customers] AS [t0]
    WHERE [t0].[CustomerID] <> @p0
    GROUP BY [t0].[Country]
    ) AS [t1]
-- @p0: Input NVarChar (Size = 0; Prec = 0; Scale = 0) []
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1

Ancak sonuçlar, doğru - elle çalıştırarak verifyable

        const string sql = @"
SELECT c.Country, COUNT(DISTINCT c.City) AS [Count]
FROM Customers c
WHERE c.CustomerID != ''
GROUP BY c.Country
ORDER BY c.Country";
        var qry2 = ctx.ExecuteQuery<QueryResult>(sql);
        foreach(var row in qry2)
        {
            Console.WriteLine("{0}: {1}", row.Country, row.Count);
        }

Tanımlama:

class QueryResult
{
    public string Country { get; set; }
    public int Count { get; set; }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MandMEvangelists

    MandMEvangel

    28 Ocak 2008
  • MisterBrightside

    MisterBright

    24 Mart 2006
  • Wild Academy

    Wild Academy

    8 Aralık 2009