2016-03-31 4 views
-1
Declare OccasionName Varchar(100) 
set @OccasionName=(select distinct (Message) from OrderProducts 
where message like '%b''day%' or message like '%bday%' or Message like '%Birth%') 
select Count(Distinct od.OrderID) as TotalOrders from orderdetails od 
inner join (select Orderid,Message from OrderProducts) op on od.Orderid=op.OrderiD 
where od.Orderdate between '01/01/2015' and '01/05/2015' 
and op.Message like '%' + @OccasionName + '%' 
and (od.TransactionId is not null) AND (od.TransactionId<>'') 

Dies ist der Fehler:Gelegenheit weise Orders Count

Subquery mehr als 1 Wert zurückgegeben. Dies ist nicht zulässig, wenn die Unterabfrage folgt =,! =, <, < =,>,> = oder wenn die Unterabfrage als Ausdruck verwendet wird.

+0

Distinct ist keine Funktion, es ist ein Teil von 'Select distinct' und wirkt auf die gesamten ausgewählten Zeilen. – jarlh

+0

Was verstehst du nicht? Sie haben mehr als eine passende Nachricht in 'OrderProduct'. –

+1

Sie versuchen, das Ergebnis dieser '(wählen Sie eindeutig (Message) von OrderProducts wo Nachricht wie '% b''day%' oder Nachricht wie '% Bday%' oder Nachricht wie '% Birth%')' zu ' @OrtName'. Aber es scheint, als ob es dir mehr als 1 Reihe gibt. –

Antwort

1

Sie Abfrage scheint viel zu kompliziert für das, was Sie sehen wollen, zu erreichen. Ich denke, das tut, was Sie wollen:

select Count(Distinct od.OrderID) as TotalOrders 
from OrderDetails od inner join 
    OrderProducts op 
    on od.Orderid = op.OrderiD 
where od.Orderdate between '2015-01-01' and '2015-05-01' and 
     od.TransactionId <> '' and 
     (op.message like '%b''day%' or 
     op.message like '%bday%' or 
     op.Message like '%Birth%' 
    ); 

Hinweise:

  • Es besteht keine Notwendigkeit, eine Variable zu definieren. Die Logik kann direkt in die Abfrage gehen.
  • Ihr ursprüngliches Problem besteht darin, dass mehrere Nachrichten den Bedingungen entsprechen, daher der Fehler.
  • Die Unterabfrage auf OrderProducts ist überflüssig. SQL Server ist intelligent genug, um es zu ignorieren, aber es könnte andere Datenbanken verwirren.
  • Die is not null Bedingung ist tatsächlich redundant, wenn ein anderer Vergleich in der Spalte vorgenommen wird.
  • Sie sollten ISO-Datumsformate (YYYY-MM-DD) oder SQL Server-Standard (JJJJMMTT) verwenden, keine regionsspezifischen Datumsformate.
  • Wenn Sie keine Informationen zu den zugrunde liegenden Daten erhalten, besteht das Risiko, dass Sie ein kartesisches Produkt erhalten, wenn "Produkte" und "Details" für eine Order unabhängige Dimensionen sind.
+0

Sehr detaillierte Antwort. +1 für Geduld. –

+0

Danke ... aber ich möchte diese Abfrage in sp ... so muss ich Variable ... @Gordon Linoff deklarieren .. Ich habe so viele Gelegenheiten wie Jahrestag, Hochzeit etc – Maybe

Verwandte Themen