簡體   English   中英

如何對多列進行分組並計數?

[英]How can I group with multiple columns and count?

首先,我無法在標題中正確解釋我的問題,但我認為它不是重復的。 我有一個 model 列表,它 id 喜歡按多個字段分組,然后將它們計入新字段,並將所有其他字段保留在結果中。 對於錯誤的解釋,我很抱歉,我已經研究了幾個小時如何做到這一點,但我無法弄清楚..我想從中得到:

銷售編號 名稱 產品 地址 電話 打印類型
112 蘋果 新街12 11223344 打印類型 1
112 蘋果 新街12 11223344 打印類型2
112 蘋果 新街12 11223344 打印類型2
112 蘋果 新街12 11223344 打印類型2
112 蘋果 新街12 11223344 打印類型3
113 獼猴桃 新街12 11223344 打印類型3
114 橙子 新街19號 72754722 打印類型 1
115 約翰 橙子 新街11號 99236527 打印類型2
115 約翰 橙子 新街11號 99236527 打印類型2

按 SaleID 和 PrintType 分組,如下所示:

銷售編號 名稱 產品 地址 電話 NoOfPrintType1 NoOfPrintType2 NoOfPrintType3
112 蘋果 新街12 11223344 1個 3個 1個
113 獼猴桃 新街12 11223344 0 0 1個
114 橙子 新街19號 72754722 1個 0 0
115 約翰 橙子 新街11號 99236527 0 2個 0

最好 id 喜歡使用 LINQ,但 id 也可以使用 SQL,id 只是想盡可能避免使用 for 循環。 編輯:有一定數量的打印類型,因此它不需要是動態的。

為了聚合一組 PrintTypes 的數據,您可以按 SaleId 分組,因為地址、電話和產品等附加數據對於 SaleId 是相同的(基於您的示例數據)。

var aggregated = from x in GenerateSales() 
    group x by x.SaleId into g // Assume that SaleId is the key that you want to group by
    select new Aggregate() 
    { 
        SaleId = g.Key, 
        // Additional data that are the same for all rows with the same SaleId
        Name = g.First().Name, 
        Product = g.First().Product, 
        Address = g.First().Address, 
        Phone = g.First().Phone, 
        // Calculate counts of Print Types
        NoOfPrintType1 = g.Where(x => x.PrintType == "PrintType1").Count(),
        NoOfPrintType2 = g.Where(x => x.PrintType == "PrintType2").Count(),
        NoOfPrintType3 = g.Where(x => x.PrintType == "PrintType3").Count(),
    };

Linq 語句首先按 SaleId 分組,然后為每個 SaleId 創建一個 object,它包括

  • 銷售編號
  • 地址,電話等附加數據...
  • 每個已知 PrintType 的計數(通過過濾組的項目然后計算行數來計算)

您可以在下面找到生成測試數據並輸出結果的示例。

結果

112 | Joe | Apple | New street 12 | 11223344 | 1 | 3 | 1
113 | Joe | Kiwi | New street 12 | 11223344 | 0 | 0 | 1
114 | Jane | Orange | New street 19 | 72754722 | 1 | 0 | 0
115 | John | Orange | New street 11 | 99236527 | 0 | 2 | 0

示例代碼

using System;
using System.Collections.Generic;
using System.Linq;

namespace LinqTest
{
    class Sale 
    {
        public string SaleId { get; set; }
        public string Name { get; set; }
        public string Product { get; set; }
        public string Address { get; set; }
        public string Phone { get; set; }
        public string PrintType { get; set; }
    }

    class Aggregate 
    {
        public string SaleId { get; set; }
        public string Name { get; set; }
        public string Product { get; set; }
        public string Address { get; set; }
        public string Phone { get; set; }
        public int NoOfPrintType1 { get; set; }
        public int NoOfPrintType2 { get; set; }
        public int NoOfPrintType3 { get; set; }

        public override string ToString() 
        {
            return $"{SaleId} | {Name} | {Product} | {Address} | {Phone} | {NoOfPrintType1} | {NoOfPrintType2} | {NoOfPrintType3}";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var aggregated = from x in GenerateSales() 
                group x by x.SaleId into g // Assume that SaleId is the key that you want to group by
                select new Aggregate() 
                { 
                    SaleId = g.Key, 
                    // Additional data that are the same for all rows with the same SaleId
                    Name = g.First().Name, 
                    Product = g.First().Product, 
                    Address = g.First().Address, 
                    Phone = g.First().Phone, 
                    // Calculate counts of Print Types
                    NoOfPrintType1 = g.Where(x => x.PrintType == "PrintType1").Count(),
                    NoOfPrintType2 = g.Where(x => x.PrintType == "PrintType2").Count(),
                    NoOfPrintType3 = g.Where(x => x.PrintType == "PrintType3").Count(),
                };
            foreach(var a in aggregated)
            {
                Console.WriteLine(a.ToString());
            }
        }

        static IEnumerable<Sale> GenerateSales()
        {
            yield return new Sale() { SaleId = "112", Name = "Joe", Product = "Apple", Address = "New street 12", Phone = "11223344", PrintType = "PrintType1" };
            yield return new Sale() { SaleId = "112", Name = "Joe", Product = "Apple", Address = "New street 12", Phone = "11223344", PrintType = "PrintType2" };
            yield return new Sale() { SaleId = "112", Name = "Joe", Product = "Apple", Address = "New street 12", Phone = "11223344", PrintType = "PrintType2" };
            yield return new Sale() { SaleId = "112", Name = "Joe", Product = "Apple", Address = "New street 12", Phone = "11223344", PrintType = "PrintType2" };
            yield return new Sale() { SaleId = "112", Name = "Joe", Product = "Apple", Address = "New street 12", Phone = "11223344", PrintType = "PrintType3" };
            yield return new Sale() { SaleId = "113", Name = "Joe", Product = "Kiwi", Address = "New street 12", Phone = "11223344", PrintType = "PrintType3" };
            yield return new Sale() { SaleId = "114", Name = "Jane", Product = "Orange", Address = "New street 19", Phone = "72754722", PrintType = "PrintType1" };
            yield return new Sale() { SaleId = "115", Name = "John", Product = "Orange", Address = "New street 11", Phone = "99236527", PrintType = "PrintType2" };
            yield return new Sale() { SaleId = "115", Name = "John", Product = "Orange", Address = "New street 11", Phone = "99236527", PrintType = "PrintType2" };
        }
    }
}

你可以使用這個 SQL 查詢

with x as (
   SELECT  [SaleID],[Name],[Product],[Address],[Phone],[PrintType]
          ,case when [PrintType]='PrintType1' then count(*) else 0 end NoOfPrintType1
          ,case when [PrintType]='PrintType2' then count(*) else 0 end NoOfPrintType2
          ,case when [PrintType]='PrintType3' then count(*) else 0 end NoOfPrintType3
      FROM [Table_1]
      group by [SaleID] ,[Name],[Product],[Address],[Phone] ,[PrintType])
    
    select [SaleID],[Name],[Product],[Address],[Phone]
          ,sum(NoOfPrintType1)NoOfPrintType1
          ,sum(NoOfPrintType2)NoOfPrintType2
          ,sum(NoOfPrintType3)NoOfPrintType3 from x
   group by [SaleID]
          ,[Name],[Product],[Address],[Phone]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM