2017-02-21 3 views
0

Verwenden von SQL Server 2012.Count ein berechnetes Feld

Ich habe den folgenden Code:

Select Distinct [A_number] + '-' + convert(varchar(10),[zone]) As myNumber 
FROM [dbo].[soils]; 

Ich brauche diese Abfrage bearbeiten mir eine Zählung jedes myNumber zu geben. Grüße,

Antwort

1

Was würde ich tun, ist eine group by Anweisung:

SELECT A_number, 
    zone, 
    COUNT(*) AS c 
FROM dbo.soils 
GROUP BY A_number, 
    zone; 

Dann die Ihre Felder verketten führen. es auf diese Weise tun, wird für die Verwendung von indexs erlauben:

WITH numbers AS (
    SELECT A_number, 
     zone, 
     COUNT(*) AS c 
    FROM dbo.soils 
    GROUP BY A_number, 
     zone 
) 
SELECT A_number + '-' + convert(varchar(10),zone) As myNumber, 
    c AS number_count 
FROM numbers; 
+0

Doing die Gruppe von Operation auf nackten Spalten ist das normative Muster. Dadurch kann ein geeigneter Index verwendet werden. Ohne WHERE-Klausel hätte die beste Wette für einen optimalen Index für diese Abfrage führende Spalten von '(A_number, zone)'. +10. Es gibt einen Randfall, in dem diese Abfrage ein anderes Ergebnis als das Original liefert. Betrachte Zeilen mit '(A_number, zone)' Werten von '('1 -', 'a')' und '('1', '- a')'. – spencer7593

0

Mit COUNT()

SELECT COUNT(DISTINCT [A_number] + '-' + CONVERT(VARCHAR(10),[zone])) 
FROM [dbo].[soils] 

, die Ihnen eine Zählung auf einzigartige myNumber aus der Umwandlung geben.

Und betrachten Sie GROUP BY, wenn Sie eine Zählung von jeder eindeutigen MyNumber benötigen.

SELECT [A_number] + '-' + CONVERT(VARCHAR(10),[zone]), COUNT(*) 
FROM [dbo].[soils] 
GROUP BY [A_number] + '-' + CONVERT(VARCHAR(10),[zone]) 
+0

Danke, aber ich brauche eine Zählung von jeder eindeutigen MyNumber nicht die Gesamtzahl der eindeutigen MyNumber – PeterTheGeo

+0

Betrachten Sie "GROUP BY" – ydoow

0

Um eine Anzahl von Zeilen mit jedem Wert von myNumber, Graben der DISTINCT und verwenden stattdessen eine GROUP BY zugeordnet zu bekommen.

direkteste Beispiel, wiederholen Sie den Ausdruck in der SELECT-Liste in den GROUP BY-Klausel:

SELECT [A_number] + '-' + CONVERT(VARCHAR(10),[zone]) AS myNumber 
    , COUNT(*) AS cnt 
    FROM [dbo].[soils] 
GROUP 
    BY [A_number] + '-' + CONVERT(VARCHAR(10),[zone]) 

Für triviale Sätze, Leistung wird kein Problem sein. Bei größeren Sets kann die Leistung darunter leiden. Die Lösung besteht darin, die Abfrage zu überarbeiten, um vorhandene Indizes zu nutzen, oder entsprechende Indizes hinzuzufügen.

+0

@JRLambert: Sie haben Recht. DOH! Das "COUNT (*)" - Aggregat wurde komplett verpasst. Jetzt behoben. Ich hätte auch wählen können, "SUM (1) AS cnt" zu verwenden – spencer7593

Verwandte Themen