2015-11-23 3 views
0

Поэтому мне нужно объединить эти два отдельных запроса с помощью оператора CASE. Моя общая цель: «Я ищу, чтобы найти все места, которые живут и живут бесплатно, а не демо. Эти местоположения ДОЛЖНЫ быть расположены в США или Канаде. Узнайте, сколько клиентов в этих местах заполнено своей страной, НЕ США или Канада, в отличие от того, сколько у них общего числа клиентов ».Мне нужно объединить два отдельных запроса, используя оператор CASE

Так что у меня есть оба вопроса, и они оба работают отдельно.

Вот первый, который возвращает клиентов НЕ в США.

SELECT 
    COUNT(1) AS "Not in US or Canada verse Total Customers" 
FROM 
    dbo.Spa (nolock) 
LEFT JOIN 
    dbo.Customer ON dbo.Customer.SpaID = dbo.Spa.ID 
WHERE 
    dbo.Spa.TimeZoneID IN (6, 9, 12, 18) 
    AND dbo.Spa.IsDeleted = 0 
    AND dbo.Spa.StatusID IN (3, 4) 
    AND dbo.Customer.CountryID != 1 
    AND dbo.Customer.countryID != 2; 

Это второй, который возвращает ВСЕ клиентов.

SELECT 
    COUNT(1) AS "Total Customers" 
FROM 
    dbo.Spa (nolock) 
LEFT JOIN 
    dbo.Customer ON dbo.Customer.SpaID = dbo.Spa.ID 
WHERE 
    dbo.Spa.TimeZoneID IN (6, 9, 12, 18) 
    AND dbo.Spa.IsDeleted = 0 
    AND dbo.Spa.StatusID IN (3, 4); 

Может кто-нибудь помочь мне поставить их вместе, используя случай заявление, в котором он будет показывать клиентам не в США и Канаде стихотворных общих клиентов в одной таблице с помощью сазе.

Спасибо!

ответ

1

Вы можете сделать это с помощью выражения case.

SELECT sum(case when dbo.Customer.CountryID <> 1 AND dbo.Customer.countryID <> 2 then 1 end) as NotInUS 
    , COUNT(1) AS "Not in US or Canada verse Total Customers" 
FROM dbo.Spa (nolock) 
LEFT JOIN dbo.Customer ON dbo.Customer.SpaID = dbo.Spa.ID 
WHERE dbo.Spa.TimeZoneID IN(6,9,12,18) 
AND dbo.Spa.IsDeleted= 0 
AND dbo.Spa.StatusID IN (3,4) 

Кроме того, вы должны, вероятно, выбраться из привычки разбрызгивать NOLOCK повсюду. У этого есть некоторые очень серьезные и часто непонятые побочные эффекты. http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/

2

Если я правильно понял ваш вопрос правильно, я думаю, что это то, что вы ищете:

SELECT  COUNT(1) AS "All customers", 
      SUM(CASE WHEN (dbo.Customer.CountryID != 1 AND dbo.Customer.countryID != 2) 
       THEN 1 ELSE 0 END) AS "Not in US or Canada verse Total Customers" 
FROM  dbo.Spa (nolock) 
LEFT JOIN dbo.Customer ON dbo.Customer.SpaID = dbo.Spa.ID 
WHERE  dbo.Spa.TimeZoneID IN(6,9,12,18) 
AND   dbo.Spa.IsDeleted= 0 
AND   dbo.Spa.StatusID IN (3,4) 
0

Вы можете просто сделать каждый запрос подвыбор:

SELECT (query1) as '', (query2) as '' 
0

В своем первом запросе вы используете левое соединение, но затем фильтруете по CountryID, который устранит Spa строк, у которых не было подходящей страны. На самом деле это может быть не так, но вы должны знать, что в результате этого изменения вы можете получить разные счета в общей сумме. Если в «Спа» (?) Может быть не более одного клиента, то присоединение к этой таблице (во втором запросе) даже не выполняет ничего, но трудно угадать, если вы намеревались это сделать.

select 
    count(case when c.CountryID not in (1, 2) then 1 else null end), 
    count(*) 
from 
    dbo.Spa as s 
    left outer join dbo.Customer as c 
     on c.SpaID = s.SpaID 
where 
     s.TimeZoneID in (6, 9, 12, 18) 
    and s.IsDeleted = 0 
    and s.StatusID in (3, 4) 
0

Вот пример того, как использовать саз в COUNT(), чтобы рассчитывать только на указанную группу:

WITH 
    /* 
    Get a list of all customers and their country to use as the main data set as an example 
    */ 
    mainSet AS 
     (
     SELECT 
      contact.FirstName, 
      address.city, 
      stateProvince.countryRegionCode 
     FROM person.address AS address 
     INNER JOIN sales.customerAddress AS customerAddress ON 
      address.addressID = customerAddress.addressID 
     INNER JOIN sales.customer AS customer ON 
      customerAddress.customerID = customer.customerID 
     INNER JOIN person.contact AS contact ON 
      customer.customerID = contact.contactID 
     INNER JOIN person.stateProvince AS stateProvince ON 
      address.stateProvinceID = stateProvince.stateProvinceID 
     ) 

    SELECT 
     --------------------------------------------------Count all customers using COUNT() 
     COUNT(countryRegionCode) AS 'All Customers Count', 

     --------------------------------------------------Count all customers using COUNT() with a CASE statement 
     COUNT(CASE WHEN countryRegionCode NOT IN('US','CA') THEN countryRegionCode END) AS 'Customers not in US/CA' 
    FROM mainSet 
Смежные вопросы