EddyGuzman Ответов: 1

Сортировка списка по верхнему результату за час от даты и времени


Привет.
Я пытаюсь сделать запрос, чтобы вычислить общее количество записей в час в таблице и показать только верхнее значение для даты.
Например, сегодня модель а имеет результаты 6 для 100 ПК, 7 для 200 ПК и 8 для 50 ПК. В этом случае мне нужно показать только 200 ПК в столбце и время (7) в другом столбце.
Я смог показать верхние значения, но я не могу показать время, если я покажу время, то верх не работает...
Образцы:
В Том Числе Часов:
Без Верха[^]
Не Считая Часов:
WithTop[^]
Я очень ценю вашу помощь!

Что я уже пробовал:

Это тот самый запрос, который я пробовал до сих пор (без часа)
SELECT *
FROM
       (
       select count(barcodenum)as count1, date1, Model_sap, model_customer, linea
       from   (  
                           SELECT FinishGoods.linea, FinishGoods.Model_sap, model.model_customer,FinishGoods.BarCodeNum,CONVERT(VARCHAR(10), scanprod.fecha, 102) as date1, scanprod.fecha
                           FROM FinishGoods  INNER JOIN model ON FinishGoods.Model_sap = model.model_ext INNER JOIN scanprod ON FinishGoods.BarCodeNum = scanprod.barcodenum  
                           WHERE (FinishGoods.linea <> '0') AND (FinishGoods.linea <> '') AND FinishGoods.scandt is not null  AND (scanprod.fecha >= '2016-03-18 06:00:00' AND scanprod.fecha <= '2016-03-22 23:59:59'  ) 
                     ) as tbl1 
       group by date1,  DATEPART(Hour, fecha), Model_sap, model_customer,linea--,hora1
       --order by model_sap, linea
) AS HourlySalesData
PIVOT( max(count1) FOR [date1] IN ([2016.03.18],[2016.03.19],[2016.03.20],[2016.03.21],[2016.03.22])) AS DatePivot
order by model_customer


А этот с часовым включением:
SELECT *
FROM
       (
       select count(barcodenum)as count1, date1, Model_sap, model_customer, linea, (convert(int, DATEPART(Hour, fecha))) as hour_
       from   (  
                           SELECT FinishGoods.linea, FinishGoods.Model_sap, model.model_customer,FinishGoods.BarCodeNum,CONVERT(VARCHAR(10), scanprod.fecha, 102) as date1, scanprod.fecha
                           FROM FinishGoods  INNER JOIN model ON FinishGoods.Model_sap = model.model_ext INNER JOIN scanprod ON FinishGoods.BarCodeNum = scanprod.barcodenum  
                           WHERE (FinishGoods.linea <> '0') AND (FinishGoods.linea <> '') AND FinishGoods.scandt is not null  AND (scanprod.fecha >= '2016-03-18 06:00:00' AND scanprod.fecha <= '2016-03-22 23:59:59'  ) 
                     ) as tbl1 
       group by date1,  DATEPART(Hour, fecha), Model_sap, model_customer,linea--,hora1
       --order by model_sap, linea
) AS HourlySalesData
PIVOT( max(count1) FOR [date1] IN ([2016.03.18],[2016.03.19],[2016.03.20],[2016.03.21],[2016.03.22])) AS DatePivot
order by model_customer

CHill60

Если Решение 1 не работает для Вас, пожалуйста, используйте ссылку "улучшить вопрос", чтобы опубликовать некоторые примеры данных из каждой таблицы - большинство людей даже не попытаются помочь, если они не могут легко воспроизвести вашу проблему. "Легко" означает возможность вырезать и вставлять, а не смотреть на картинку на другом сайте.

Один совет-избавьтесь от всех этих конвертов-используйте CAST (xxx AS DATE), чтобы получить только дату и DATEPART(hh, xxx), чтобы получить час. Это не только быстрее, но и вы используете правильные типы данных (используйте только varchar для строк)

1 Ответов

Рейтинг:
12

kosmas kafataridis

Знаете ли вы

ROW_NUMBER() OVER(PARTITION BY date1 ORDER BY count1 ASC) 
он возвращает целое число, начинающееся от 1 до x, сгруппированное как collumns в partition by и orderd as in order by что-то вроде этого

SELECT *
FROM
       (
       select count(FinishGoods.BarCodeNum) as count1, CONVERT(VARCHAR(10), scanprod.fecha, 102) as date1, (convert(int, DATEPART(Hour, fecha))) as hour_,
	   ROW_NUMBER() OVER(PARTITION BY CONVERT(VARCHAR(10), scanprod.fecha, 102) ORDER BY count(FinishGoods.BarCodeNum) ASC)  as rnum
       FROM FinishGoods  INNER JOIN model ON FinishGoods.Model_sap = model.model_ext INNER JOIN scanprod ON FinishGoods.BarCodeNum = scanprod.barcodenum  
       WHERE (FinishGoods.linea <> '0') AND (FinishGoods.linea <> '') AND FinishGoods.scandt is not null  AND (scanprod.fecha >= '2016-03-18 06:00:00' AND scanprod.fecha <= '2016-03-22 23:59:59'  ) 
       group by CONVERT(VARCHAR(10), scanprod.fecha, 102), DATEPART(Hour, fecha)
       --order by model_sap, linea
) AS HourlySalesData where rnum=1

это должно сработать
ROW_NUMBER (Transact-SQL) | Microsoft Docs[^]


EddyGuzman

Работает хорошо, спасибо!