t-sql запрос не показывает ожидаемый результат - PullRequest
1 голос
/ 30 июня 2010

У меня есть данные таблицы продаж, как показано ниже

Данные таблицы продаж http://lh5.ggpht.com/_KT7tmVVBHFM/TCryAax1JlI/AAAAAAAAAFk/zahMq4RoOuw/s144/Sales.png

Я хочу, чтобы он отображал групповые продажи в соответствии с датой. Таблица продаж содержит данные для разных групп, но мой запрос показывает только две строки.

SQL-запрос:

select 
    i.gName, 
    sum(Quantity) as '180ml', 
    isnull((select sum(Quantity)
        from saleslog 
        where BillDate='12-10-2010' 
        and pSize=375 and pGroup=i.gCode),0) as '375ml', 
    isnull((select sum(Quantity)
        from saleslog 
        where BillDate='12-10-2010' 
        and pSize=500 and pGroup=i.gCode),0) as '500ml', 
    isnull((select sum(Quantity)
        from saleslog 
        where BillDate='12-10-2010' 
        and pSize=750 and pGroup=i.gCode),0) as '750ml', 
    isnull((select sum(Quantity)
        from saleslog 
        where BillDate='12-10-2010' 
        and pSize=1000 and pGroup=i.gCode),0) as '1000ml', 
    isnull((select sum(Quantity)
        from saleslog 
        where BillDate='12-10-2010' 
        and pSize=2000 and pGroup=i.gCode),0) as '2000ml' 
from saleslog as s
    inner join ItemGroup as i on s.pGroup=i.gCode 
where BillDate='12-10-2010' 
    and i.gCode=pGroup 
    and pSize=180 
group by i.gCode,i.gName

Вывод вышеуказанного запроса

WHISKY 5 2 0 0 0 0
RUM     82 0 0 45 0 0

Это показывает эти результаты, но я ожидал, что он перечислит все группы продуктов следующим образом:

Таблица группы продуктов:

1 BRANDY         1
2 WHISKY         2
3 RUM         3
4 GIN         4
5 VODKA         5
6 BEER         8
7 WINE         6
8 LIQUOR         7
9 SCOTCH WHY 9
10 LUBRICANT 15
11 UNTAXABLE 16
12 O/S LIQUOR 10
13 RTD         11
14 275 ML         12

Что не так с моим запросом?

Ответы [ 5 ]

1 голос
/ 30 июня 2010

Хорошо. Я думаю, что вам нужно переместить запрос 180 мл в подзапрос с другими. Примерно так:

select i.gName,
isnull((select sum(Quantity)from saleslog where BillDate='12-10-2010' and pSize=180 and pGroup=i.gCode),0) as '180ml', 
isnull((select sum(Quantity)from saleslog where BillDate='12-10-2010' and pSize=375 and pGroup=i.gCode),0) as '375ml', 
isnull((select sum(Quantity)from saleslog where BillDate='12-10-2010' and pSize=500 and pGroup=i.gCode),0) as '500ml',
isnull((select sum(Quantity)from saleslog where BillDate='12-10-2010' and pSize=750 and pGroup=i.gCode),0) as '750ml',
isnull((select sum(Quantity)from saleslog where BillDate='12-10-2010' and pSize=1000 and pGroup=i.gCode),0) as '1000ml',
isnull((select sum(Quantity)from saleslog where BillDate='12-10-2010' and pSize=2000 and pGroup=i.gCode),0) as '2000ml' 
from saleslog as s 
inner join ItemGroup as i on s.pGroup=i.gCode 
where BillDate='12-10-2010' 
group by i.gCode, i.gName
1 голос
/ 30 июня 2010

Что это за тип данных BillDate ??

Если это DATETIME, то это утверждение здесь

BillDate = '12-10-2010'

выберет только те покупки, которые были сделаны 12-10-2010 в полночь (0:00:00 часов).

Вы должны быть более осторожны с вашими запросами даты! DATETIME всегда также содержит часть времени - поэтому, если вы хотите, чтобы все покупки совершались 12-10-2010, вам необходимо использовать:

WHERE BillDate BETWEEN '12-10-2010 00:00:00' AND  '12-10-2010 23:59:59'

или альтернативно:

WHERE DAY(BillDate) = 12 AND MONTH(BillDate) = 10 AND YEAR(BillDate) = 2010
0 голосов
/ 30 июня 2010

По вашему запросу возвращаются только те группы товаров, которые продают не менее 1 180 мл.Измените ВНУТРЕННЕЕ СОЕДИНЕНИЕ на подвыбор, как вы сделали с другими размерами продуктов, и вы получите все группы продуктов в наборе результатов.

0 голосов
/ 30 июня 2010

Этот запрос не имеет смысла семантически, но работает, как только вы усердно об этом думаете.

Например:

Вы выбираете сумму всех продаж для группы в качестве 180 мл:

sum(Quantity) as '180ml'

Но вы рассчитываете общий объем в 180 мл, чтобы противостоять этому

where pSize=180

Я бы сказал, что это потому, что другие группы не имеют размеров 180 мл для продажи.

0 голосов
/ 30 июня 2010

Попробуйте изменить предложение FROM на:

from ItemGroup as i
    LEFT OUTER JOIN saleslog as s ON i.gCode = s.pGroup AND s.BillDate = '12-10-2010' AND s.pSize=180
group by i.gCode,i.gName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...