#mysql #vb.net
#mysql #vb.net
Вопрос:
У меня есть sql statment, я получаю данные из него в datatable, но мне нужно отфильтровать данные по dataview и создать группу y с суммой количества для каждой группы:
SELECT
FatoraReso as xAcc,
AccName AS xAccName,
FatoraDate AS xDate,
FatoraProduct as xProdID,
ProductName AS xProdName,
FatoraPurPrice as xPrice,
sum(FatoraQuan) as xQuan,
COUNT(FatoraID) AS xCarCount
from tblfatora
INNER JOIN tblaccounts ON tblaccounts.AccID = tblfatora.FatoraReso
INNER JOIN tblproducts ON tblproducts.ProductID = tblfatora.FatoraProduct
GROUP BY xAcc,xDate,xProdID,xPrice
UNION ALL
SELECT
FatoraCustomer as xAcc,
AccName AS xAccName,
FatoraDate AS xDate,
FatoraProduct as xProdID,
ProductName AS xProdName,
FatoraSalePrice as xPrice,
sum(FatoraQuan) as xQuan,
COUNT(FatoraID) AS xCarCount
from tblfatora
INNER JOIN tblaccounts ON tblaccounts.AccID = tblfatora.FatoraCustomer
INNER JOIN tblproducts ON tblproducts.ProductID = tblfatora.FatoraProduct
GROUP BY xAcc,xDate,xProdID,xPrice
ORDER BY xProdID,xPrice
Я создал фильтр по xAcc и XDate, а затем я не знал, как применить group by с получением суммы для каждой группы.
Я видел некоторые решения об использовании LINQ, но на самом деле я ничего не знаю о LINQ.
так что можете мне помочь, пожалуйста.
последняя таблица, которую я хочу, это:
--------- -------- ------- -----------
| xProdID | xPrice | xQuan | xCarCount |
--------- -------- ------- -----------
| 1 | 55 | 10 | 2 |
--------- -------- ------- -----------
| 1 | 60 | 15 | 1 |
--------- -------- ------- -----------
| 2 | 150 | 12 | 3 |
--------- -------- ------- -----------
| 2 | 155 | 11 | 2 |
--------- -------- ------- -----------
tblfatora:
CREATE TABLE `tblfatora` (
`FatoraID` bigint(20) NOT NULL,
`FatoraRef` bigint(20) NOT NULL,
`FatoraCode` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`FatoraDate` date NOT NULL,
`FatoraProduct` int(11) NOT NULL,
`FatoraQuan` double NOT NULL DEFAULT '0',
`FatoraReso` int(11) NOT NULL,
`FatoraPurPrice` double NOT NULL DEFAULT '0',
`FatoraPurTotal` double NOT NULL DEFAULT '0',
`FatoraCustomer` int(11) NOT NULL,
`FatoraSalePrice` double NOT NULL DEFAULT '0',
`FatoraDis` double NOT NULL DEFAULT '0',
`FatoraPlus` double NOT NULL DEFAULT '0',
`FatoraSaleTotal` double NOT NULL DEFAULT '0',
`FatoraDriverPayStatus` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`FatoraDriver` int(11) NOT NULL,
`FatoraCarNo` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`FatoraDriverCost` double NOT NULL DEFAULT '0',
`FatoraDriverCostTotal1` double NOT NULL DEFAULT '0',
`FatoraDriverCostTotal2` double NOT NULL DEFAULT '0',
`FatoraDriverPrice` double NOT NULL DEFAULT '0',
`FatoraDetails1` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`FatoraDetails2` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`FatoraDetails3` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`FatoraPalletQuan` double NOT NULL DEFAULT '0',
`FatoraPalletPrice` double NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=COMPACT;
tblFatoraData:
INSERT INTO `tblfatora` (`FatoraID`, `FatoraRef`, `FatoraCode`, `FatoraDate`,
`FatoraProduct`, `FatoraQuan`, `FatoraReso`, `FatoraPurPrice`,
`FatoraPurTotal`, `FatoraCustomer`, `FatoraSalePrice`, `FatoraDis`,
`FatoraPlus`, `FatoraSaleTotal`, `FatoraDriverPayStatus`, `FatoraDriver`,
`FatoraCarNo`, `FatoraDriverCost`, `FatoraDriverCostTotal1`,
`FatoraDriverCostTotal2`, `Fato`raDriverPrice`, `FatoraDetails1`,
`FatoraDetails2`, `FatoraDetails3`, `FatoraPalletQuan`, `FatoraPalletPrice`)
VALUES
(1, 202010180304112, '', '2020-10-01', 41, 31, 112, 71, 2201, 93, 71, 0, 0,
2201, 'Paid', 128, '135538', 0, 0, 0, 1, '', '', '', 0, 0),
(2, 202010180720343, '', '2020-10-01', 43, 40, 112, 61, 2440, 83, 68000, 0,
0, 2720000, 'Paid', 129, '', 0, 0, 0, 1, '', '', '', 0, 0),
(3, 202010180807273, '', '2020-10-01', 43, 34, 112, 61, 2074, 341, 72000, 0,
0, 2448000, 'Paid', 130, '8142', 0, 0, 0, 1, '', '', '', 0, 0),
(4, 202010180819273, '', '2020-10-01', 50, 40, 114, 70, 2800, 76, 70, 0, 0,
2800, 'Paid', 131, '', 0, 0, 0, 1250, '', '', '', 0, 0),
(5, 202010180821373, '', '2020-10-01', 55, 39.22, 114, 66, 2588.52, 55, 66,
0, 0, 2588.52, 'Paid', 132, '', 0, 0, 0, 1250, '', '', '', 0, 0),
(6, 202010180823183, '', '2020-10-01', 50, 38, 114, 70, 2660, 360, 70, 0, 0,
2660, 'Paid', 133, '', 0, 0, 0, 1, '', '', '', 0, 0),
(7, 202010180825173, '', '2020-10-01', 50, 39, 114, 70, 2730, 67, 64, 0, 14,
2510, 'Paid', 134, '', 0, 0, 0, 1250, '', '', '', 0, 0),
(8, 202010180832333, '', '2020-10-02', 48, 31, 113, 63, 1953, 64, 56, 0, 0,
1736, 'Paid', 135, '', 0, 0, 0, 1240, '', '', '', 0, 0),
(9, 202010180833593, '', '2020-10-01', 48, 35, 113, 63, 2205, 82, 63, 0, 0,
2205,
'Paid', 136, '', 0, 0, 0, 1, '', '1', '', 0, 0),
(10, 202010180838003, '', '2020-10-01', 35, 35.46, 115, 57, 2021.22, 53, 56,
0, 0, 1985.76, 'Paid', 137, '135280', 0, 0, 0, 1240, '', '', '', 0, 0),
(11, 202010180841213, '', '2020-10-02', 43, 33, 112, 61, 2013, 79, 58, 0, 0,
1914, 'Paid', 138, '', 0, 0, 0, 1240, '', '', '', 0, 0),
(12, 202010180843373, '', '2020-10-02', 43, 39, 112, 61, 2379, 84, 70000, 0,
0, 2730000, 'Paid', 139, '10978', 0, 0, 0, 1, '', '', '', 0, 0),
(13, 202010180846253, '', '2020-10-02', 43, 39, 112, 61, 2379, 225, 56, 0, 0,
2184, 'Paid', 140, '9705', 0, 0, 0, 1240, '', '', '', 0, 0),
(14, 202010180847593, '', '2020-10-02', 43, 40, 112, 61, 2440, 344, 61, 0, 0,
2440, 'Paid', 141, '97464', 0, 0, 0, 1, '', '', '', 0, 0),
(15, 202010180849563, '', '2020-10-02', 43, 36, 112, 61, 2196, 73, 57, 0, 0,
2052, 'Paid', 142, '', 0, 0, 0, 1240, '', '', '', 0, 0),
(16, 202010180852113, '', '2020-10-02', 43, 39, 112, 61, 2379, 357, 61, 0, 0,
2379, 'Paid', 143, '151957', 0, 0, 0, 1, '', '', '', 0, 0)
Комментарии:
1. если вы не хотите использовать Linq, вы всегда можете перебрать все строки и сделать это вручную. Я не понимаю, какую группу и какую сумму вы имеете в виду. я бы выбрал отверстие в вашей круглой скобке make вокруг него и использовал это в предложении from .
2. @nbk нет проблем с linq, но мне нужен код, который может мне помочь, я хочу создать группу по xprodid и xprice и получить сумму xquan, xcarcount
3. @nbk Я добавил в сообщение пример окончательной таблицы, которая мне нужна
4. @nbk пожалуйста, посмотрите Последний комментарий в вашем ответе
5. я прочитал ваш комментарий и в своем ответе написал, почему это будет невозможно. Во-вторых, мне не нравится, когда я получаю принятый ответ, удаляю или не получаю одобрение за все мои усилия.
Ответ №1:
Вы также можете использовать каждый запрос в качестве основы (подзапроса) для выполнения дополнительных вычислений
SELECT
xProdID,
xPrice,
xProdName,
SUM(xQuan) AS xQuan,
SUM(xCarCount) AS xCarCount
FROM (SELECT
FatoraReso AS xAcc,
AccName AS xAccName,
FatoraDate AS xDate,
FatoraProduct AS xProdID,
ProductName AS xProdName,
FatoraPurPrice AS xPrice,
SUM(FatoraQuan) AS xQuan,
COUNT(FatoraID) AS xCarCount
FROM
tblfatora
INNER JOIN
tblaccounts ON tblaccounts.AccID = tblfatora.FatoraReso
INNER JOIN
tblproducts ON tblproducts.ProductID = tblfatora.FatoraProduct
GROUP BY xAcc , xDate , xProdID , xPrice
UNION ALL SELECT
FatoraCustomer AS xAcc,
AccName AS xAccName,
FatoraDate AS xDate,
FatoraProduct AS xProdID,
ProductName AS xProdName,
FatoraSalePrice AS xPrice,
SUM(FatoraQuan) AS xQuan,
COUNT(FatoraID) AS xCarCount
FROM
tblfatora
INNER JOIN
tblaccounts ON tblaccounts.AccID = tblfatora.FatoraCustomer
INNER JOIN
tblproducts ON tblproducts.ProductID = tblfatora.FatoraProduct
GROUP BY xAcc , xDate , xProdID , xPrice) t1
GROUP BY
xProdID , xPrice
ORDER BY xProdID , xPrice
Как я писал в своем комментарии.
«Я вижу две возможности получить только даты для одной или нескольких дат.
Выбор зависит от того, есть ли у вас быстрое соединение и быстрый сервер.
Решение 1;:
Вы получаете все данные в таблицу и имеете dataview для фильтрации нужных вам дат.
затем создайте подраздел, который суммирует данные в соответствии с xProdID, xPrice.
Это подходит, если у вас медленное соединение или медленный сервер базы данных, так что компьютер делает все это на стороне клиента.
Решение 2
Вы отправляете на сервер новый SELECT, как указано в сообщении, только вы добавляете предложение where, которое выбирает только соответствующие даты перед окончательной группировкой ПО и СУММОЙ.
это работает просто отлично, когда все происходит довольно быстро.
Функции агрегирования теряют данные, потому что у них есть только максимальная дата, этого может быть достаточно, но я не верю, что этого будет достаточно
Комментарии:
1. это неэффективно, оператор SQL хорош, но я фильтрую данные, которые находятся внутри Datatable, по выбору пользователя, фильтрую в соответствии с (XDate и xAcc), пропущенная вещь, которая мне нужна, — это получение суммы количества и суммы xcarcount при каждом изменении продукта и цены.
2. я не могу следовать за вами, это должно быть предусмотрено, удалите столбцы из ГРУППЫ, которые вам не нужны. если вы предоставите данные, я смогу это сделать.
3. так как вы можете выполнить sse в измененном ответе, он возвращает то, что вы публикуете
4. это выглядит так, как вы хотели
5. Добавьте дату r в свой результирующий набор, выберите, какую вы хотите МИНИМАЛЬНУЮ МАКСИМАЛЬНУЮ, проблема с группировкой заключается в том, что такие данные теряются, так как вам нужно выбрать, какую дату вы хотите представить. МИНИМАЛЬНОЕ МАКСИМАЛЬНОЕ среднее значение. В противном случае вы не сможете сортировать или фильтровать, что вы можете сделать,. не используйте dataview для этого, вместо этого берите новые данные, отфильтрованные с сервера, компьютер и базы данных достаточно быстры для этого, и вы также можете добавить диапазон дат или выделение, все, что вы хотите от datepicker, яне вижу другого способа