2013-12-23 6 views
1

Я хранил всю информацию о доставке для клиента в MyTable - CustomerId, ShippingID, ItemID, ShipDate. Отгрузка/отправкаID может содержать один или несколько элементов/идентификаторов товаров. Идентификатор доставки может иметь только один shipdate. Вот пример таблицы -COUNT с DISTINCT

CustomerID, ShippingID, ItemID, ShipDate 
C1, A1, I200, today 
C1, A1, I88, today 
C1, A2, I7, tomorrow 
C1, B1, I955, yesterday 
C2, B2.....et cetra 

Для CUSTOMERID, я хочу, чтобы отобразить различные shippingIDs, количество элементов в shippingID, ShipDate.

Ожидаемый выход -

C1, A1, 2, today 
C1, A2, 1, tomorrow 
C1, B1, 1, yesterday 
...etc 

Я попробовал -

select distinct shippingid, 
count(*) over() itemid, 
orderdate 
from mytable 
where customerID = 'C1' 

Выход -

C1, A1, 4, today 
C1, A2, 4, tomorrow 

Проблема заключается в том, что он считает все элементы для C1. Я хочу считать только товары в shippingID клиента. Как мне это сделать ?

EDIT - прямо сейчас, я не нуждаюсь в нем для всех клиентов. Только для одного. Так что группа не нужна.

Спасибо.

+0

Совокупные функции нуждаются в группе. – Mihai

+1

@Mihai Не обязательно, 'COUNT (*) OVER()' будет работать просто отлично – Lamak

+0

Замечание о том, как различные работы - http://blog.sqlauthority.com/2007/12/20/sql-server-distinct-keyword -usage-and-common-discussion/ – Steam

ответ

2
SELECT shippingid, 
     COUNT(*) Items, 
     ShipDate 
FROM mytable 
WHERE customerID = 'C1' 
GROUP BY shippingid, 
     ShipDate 
+0

В чем разница между count (*) и count (1)? – Steam

+2

@blasto none, это то же самое – Lamak

+0

Lamak - интересно, мой код - пример плохого кодирования. – Steam

0

Может быть, это:

select customerID, shippingid, itemid, count(1) 
from mytable 
group by customerId, shippingid, itemid 
+0

Прямо сейчас, мне это не нужно для всех клиентов. Только для одного. Так что группа не нужна. – Steam

1

Почему бы не использовать Group By? Это самый простой способ ... SqlFiddle

SELECT 
    CustomerID, 
    ShippingID, 
    count(1) 
FROM mytable 
GROUP BY CustomerID, ShippingID 
+0

да, это имеет смысл. – Steam

+0

В чем смысл подсчета (1)? – Steam

+2

COUNT (\ *) означает счетные записи. COUNT (столбец/выражение) означает подсчет записей, где столбец или выражение не равно нулю. Следовательно, COUNT (1) означает счетные записи, где выражение со значением 1 для каждой записи не является нулевым. Ну, 1 никогда не является нулевым, поэтому вы считаете все записи. Это еще один способ сказать COUNT (*) и доверять тому, что dbms оптимизирует это, так что на самом деле он не выполняет накладные работы для создания виртуального столбца «на лету» только для подсчета :-) –