как группировать по двум файлам в datatable в vb.net

#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, яне вижу другого способа