2016-08-08 32 views
3

Ich bin neu in SQL und ich habe Probleme mit einer Zählung Abfrage. Ich möchte die Anzahl der Ergebnisse zählen, die einen Wert zurückgeben, und auch eine zweite Anzahl zurückgeben, wenn der Wert null ist.Brauchen Sie Hilfe beim Zählen verschiedener Werte in der gleichen Tabelle in SQL

Hier ist was ich bisher habe. Wenn jemand helfen kann, würde ich es begrüßen. Vielen Dank.

Select 
    Sum(Case When Column name = '!NULL' Then 1 Else 0 End) as [Policy ID], 
    Sum(Case When Column name = 'NULL' Then 1 Else 0 End) as [No Policy Id] 
    --Count(*) as [Total] 
From 
    table.name 
Where 
    columnname >= '2016-01-01' 

Antwort

4

Verwenden IS NULL und IS NOT NULL statt nulls mit Gleichheit zu prüfen:

SELECT 
    SUM(CASE WHEN Column_name IS NOT NULL THEN 1 ELSE 0 END) AS [Policy ID], 
    SUM(CASE WHEN Column_name IS NULL  THEN 1 ELSE 0 END) AS [No Policy Id] 
--COUNT(*) AS [Total] 
FROM table.name 
WHERE columnname >= '2016-01-01' 

In SQL der Wert NULL bedeutet „unbekannt“ und damit einen Spaltenwert gegenüber anderen vergleichen = ergibt auch ein unbekanntes Ergebnis mit. Verwenden Sie stattdessen IS NULL oder IS NOT NULL.

1

@ Antwort TimBiegelesien das ist richtig das einzige, was ich/möchte hinzufügen vorschlagen würde, wenn Spaltenname eine leere Zeichenfolge (‚‘) enthält und Sie wollen es als NULL zählen Sie so etwas tun könnte:

Select 
Sum(Case When LENGTH(ColumnName) > 0 Then 1 Else 0 End) as [Policy ID], 
Sum(Case When LENGTH(ColumnName) < 1 Then 1 Else 0 End) as [No Policy Id] 
--Count(*) as [Total] 
From table.name 
Where columnname >= '2016-01-01' 

Hinweis in einigen rdbms LÄNGE ist eigentlich LEN

Select 
Sum(Case When LEN(ColumnName) > 0 Then 1 Else 0 End) as [Policy ID], 
Sum(Case When LEN(ColumnName) < 1 Then 1 Else 0 End) as [No Policy Id] 
--Count(*) as [Total] 
From table.name 
Where columnname >= '2016-01-01' 

Dies wird auch dann funktionieren, wenn der Datentyp numerisch ist (int, bigint, etc.)

1

Hier ein Beispiel mit zwei separaten Abfragen:

SELECT COUNT(CASE WHEN LEN(columnname) > 1 THEN 1 ELSE 0 END) AS [Policy ID] FROM table.name 
WHERE columnname >= '2016-01-01'; 

    SELECT COUNT(CASE WHEN columnname IS NULL THEN 1 ELSE NULL END) 
AS [No Policy ID] FROM table.name 
WHERE columnname >= '2016-01-01';