2015-07-11 44 views
1

我想創建一些由三列組成的SQL,然後獲取那些形成分組結果的行的COUNT如何按3列進行分組 - 並且 - 在SQL Server中獲取計數?

此外,按照最高的數量排序,第一。

I've created a SqlFiddle幫我。

表模式(簡化):

CREATE TABLE [dbo].[Foo] 
(
    [FooId] [int] IDENTITY(1,1) NOT NULL, 
    [CreatedOn] [datetime] NOT NULL, 
    [Company] [varchar](20) NOT NULL, 
    [ProductFirstname] [varchar](100) NOT NULL, 
    [ProductLastname] [varchar](100) NOT NULL 
) 

樣本數據:

INSERT INTO Foo VALUES ('2001-10-01T07:07:07', 'Red', 'Yummy', 'GummyBear'); 
INSERT INTO Foo VALUES ('2002-10-01T07:07:07', 'Red', 'Yummy', 'GummyBear'); 
INSERT INTO Foo VALUES ('2003-10-01T07:07:07', 'Red', 'Bannana', 'Cake'); 
INSERT INTO Foo VALUES ('2003-11-11T07:07:07', 'Red', 'Green', 'Apples'); 
INSERT INTO Foo VALUES ('2004-10-01T07:07:07', 'Red', 'Yummy', 'GummyBear'); 
INSERT INTO Foo VALUES ('2005-10-01T07:07:07', 'Blue', 'Yummy', 'GummyBear'); 
INSERT INTO Foo VALUES ('2006-10-01T07:07:07', 'Blue', 'Yummy', 'GummyBear'); 
INSERT INTO Foo VALUES ('2007-10-01T07:07:07', 'Blue', 'Yummy', 'GummyBear'); 
INSERT INTO Foo VALUES ('2008-10-01T07:07:07', 'Red', 'Yummy', 'GummyBear'); 
INSERT INTO Foo VALUES ('2009-10-01T07:07:07', 'Blue', 'Green', 'Apples'); 

預期結果:

+-----------------------------------+ 
| Company | Name   | Count | 
+-----------------------------------+ 
| Red | Yummy GummyBear | 4 | 
| Blue | Yummy GummyBear | 3 | 
| Red | Bannana Cake | 1 | 
| Red | Green Apples | 1 | 
| Blue | Green Apples | 1 | 
+-----------------------------------+ 
與此數據

所以,CreatedOn基本上忽略。這是另一種用途的元數據。

回答

4

這是你在找什麼:

SELECT 
    Company 
    , ISNULL(ProductFirstname, '') + ' ' + ISNULL(ProductLastName, '') NAME 
    , COUNT(*) Count 
FROM foo 
GROUP BY Company 
    ,ISNULL(ProductFirstname, '') + ' ' + ISNULL(ProductLastName, '') 
ORDER BY 3 DESC 

這裏是一個工作SQLFiddle

+0

哇 - 什麼是'ORDER BY 3 DESC'? –

+0

@ Pure.Krome它在第3列按降序對結果進行排序。我已經這樣做了,以便按照您的示例中的順序來獲取列表。我也可以使用'ORDER BY COUNT(*)DESC'。您只能指定「數字」列。很明顯,如果你改變了列的順序,它仍然會根據第三列對結果進行排序,所以有時候你可能想明確地說**你想要排序的列(在這種情況下,通過使用COUNT(*) DESC'而不是'3 DESC',但爲簡單起見,我用它)。現在清楚嗎? –

+1

如果你用'COUNT(*)DESC'取代'3',那會讓編譯器做第二個'COUNT(*)'還是隻用'SELECT'的結果呢?即。使用'3'會更快/更便宜,還是沒有差異(除了視覺效果)。 –

0

嘗試以下,

Select company, name, count(*) as count from 
(
select 
    company, 
    (ProductFirstname + ProductLastName) as name, 
from foo 
)T 
group by company, name 
Order by 3 desc 
相關問題