Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何分组并包含零和_C#_Sql_Ms Access 2007 - Fatal编程技术网

C# 如何分组并包含零和

C# 如何分组并包含零和,c#,sql,ms-access-2007,C#,Sql,Ms Access 2007,我试图编写一个查询,返回用户在我的应用程序中创建的每个类别中的事务总数。我的当前查询工作正常,但如果尚未在该类别下进行任何交易,则不会显示该类别。我希望我的查询显示每个类别,即使所有内容的总和为0 我查了一下怎么做,有人建议我使用左/右外连接,但它不能满足我的要求 我正在通过Windows C应用程序访问Microsoft Access 2007数据库。这是我当前的查询: SELECT Categories.CategoryName , SUM( Transactions.Tran

我试图编写一个查询,返回用户在我的应用程序中创建的每个类别中的事务总数。我的当前查询工作正常,但如果尚未在该类别下进行任何交易,则不会显示该类别。我希望我的查询显示每个类别,即使所有内容的总和为0

我查了一下怎么做,有人建议我使用左/右外连接,但它不能满足我的要求

我正在通过Windows C应用程序访问Microsoft Access 2007数据库。这是我当前的查询:

SELECT Categories.CategoryName ,
       SUM( Transactions.TransactionCredit ) as CreditSum ,
       SUM( Transactions.TransactionDebit  ) as DebitSum  ,
       SUM( Transactions.TransactionCredit ) -
       SUM( Transactions.TransactionDebit  ) as Difference ,
       SUM( Transactions.TransactionDebit  ) /
       ( SELECT SUM(TransactionDebit)
         FROM Transactions
         WHERE AccountID = {currentAccountId}
       ) as 'Percent of Total Debit'
FROM Categories
LEFT JOIN Transactions on Categories.CategoryName = Transactions.CategoryName
WHERE Transactions.AccountID = {currentAccountId}
  AND TransactionDate >= {startDate}
  AND TransactionDate <= {endDate}
GROUP BY Categories.CategoryName
这是我的c应用程序中的编码方式:

queries.returnQuery("SELECT Categories.CategoryName, " +
"SUM(Transactions.TransactionCredit) as CreditSum, " +
"SUM(Transactions.TransactionDebit) as DebitSum, " +
"SUM(Transactions.TransactionCredit) - SUM(Transactions.TransactionDebit) as Difference, " +
"SUM(Transactions.TransactionDebit) / (SELECT SUM(TransactionDebit) FROM Transactions WHERE AccountID = " + currentAccountID + ") as 'Percent of Total Debit' " +
"FROM Categories LEFT JOIN Transactions on Categories.CategoryName = Transactions.CategoryName " +
"WHERE Transactions.AccountID = " + currentAccountID +
(enableDateFilter ? " AND Transactions.TransactionDate >= #" + startDate + "# AND Transactions.TransactionDate <= #" + endDate + "# " : " ") +
" GROUP BY Categories.CategoryName");

如果没有双引号,您的查询将更容易理解。在任何情况下,问题在于where子句引用事务表,从而撤消左侧外部联接。将这些条件移到on子句中。在您的情况下,通过更改到何处和:

当您在类别和事务之间使用左连接时,您应该期望事务表上的值为NULL。在JOIN子句中包含AccountID筛选器将起到以下作用:

DECLARE @currentAccountId INT
SELECT  @currentAccountId = 1

;WITH   Transactions AS
(
    SELECT  *
    FROM    (   
    VALUES
                (1, 1000., 2000., 'Category B'),
                (2, 2000., 1000., 'Category B'),
                (1, 1000., 1000., 'Category C')
            )
            T ( AccountID, TransactionCredit, TransactionDebit, CategoryName)
),      Categories AS
(
    SELECT  *
    FROM    (
    VALUES
                ('Category A'),
                ('Category B'),
                ('Category C')
            )
            C (CategoryName)
)
SELECT      Categories.CategoryName ,
            SUM( Transactions.TransactionCredit ) as CreditSum ,
            SUM( Transactions.TransactionDebit  ) as DebitSum  ,
            SUM( Transactions.TransactionCredit ) -
            SUM( Transactions.TransactionDebit  ) as Difference ,
            SUM( Transactions.TransactionDebit  ) /
            (
                SELECT  SUM(TransactionDebit)
                FROM    Transactions
                WHERE   AccountID = @currentAccountId
            ) AS 'Percent of Total Debit'
FROM        Categories
LEFT JOIN   Transactions
    ON      Categories.CategoryName = Transactions.CategoryName
            AND Transactions.AccountID = @currentAccountId
            --AND TransactionDate >= {startDate}
            --AND TransactionDate <= {endDate}
GROUP BY    Categories.CategoryName

我面临的问题是,当使用联接时,必须使用将两个表比较在一起的条件。就我而言,我没有那样做。我使用了用户在c应用程序中选择的参数,因此我使用了一个子查询来代替事务表,并得到了预期的结果。请参见下面我的解决方案:

C中的解决方案:

queries.returnQuery("SELECT Categories.CategoryName, " +
                           "SUM(SUBQUERY.TransactionCredit) as CreditSum, " +
                           "SUM(SUBQUERY.TransactionDebit) as DebitSum, " +
                           "SUM(SUBQUERY.TransactionCredit) - SUM(SUBQUERY.TransactionDebit) as Difference " +
                           "FROM Categories LEFT JOIN " +
                               "(SELECT CategoryName, TransactionCredit, TransactionDebit FROM Transactions WHERE AccountID = " + currentAccountID + 
                               (enableDateFilter ? " AND TransactionDate >= #" + startDate + "# AND TransactionDate <= #" + endDate + "# " : " ") + 
                               ") AS SUBQUERY " + 
                           "ON Categories.CategoryName = SUBQUERY.CategoryName " +
                           "GROUP BY Categories.CategoryName");
解决方案不在C中:

SELECT Categories.CategoryName ,
       SUM( SUBQUERY.TransactionCredit ) as CreditSum ,
       SUM( SUBQUERY.TransactionDebit  ) as DebitSum  ,
       SUM( SUBQUERY.TransactionCredit ) -
       SUM( SUBQUERY.TransactionDebit  ) as Difference ,
       SUM( SUBQUERY.TransactionDebit  ) /
       ( SELECT SUM(TransactionDebit)
         FROM Transactions
         WHERE AccountID = {currentAccountId}
       ) as 'Percent of Total Debit'
FROM Categories
LEFT JOIN 
(
    SELECT CategoryName, 
           TransactionCredit, 
           TransactionDebit 
    FROM Transactions 
    WHERE AccountID = {currentAccountID}
      AND TransactionDate >= {startDate}
      AND TransactionDate <= {endDate}
) as SUBQUERY 
ON Categories.CategoryName = SUBQUERY.CategoryName
GROUP BY Categories.CategoryName

我为此道歉。我必须用C写,所以我只是复制粘贴它。但是,您所说的将导致错误JOIN表达式,而不是supported@Flappy . . . 原因是左外连接,MS Access称之为左连接。我将其更改为左连接,但仍然无法解决问题。虽然Nicholas重新格式化了我的问题,因此现在查询更容易阅读。而且,这也不是原因,因为如果我将WHERE留在其中,查询工作会非常好。如果我将它改为,并且得到错误的JOIN表达式not supportedOk,但是@Rubens,这个方法就不能像我在Gordon的帖子中所说的那样工作。当我为左连接包含多个条件时,我得到了不支持的错误连接表达式。如果我将第一个和更改为a,则查询可以正常工作,但不会产生预期的结果。
queries.returnQuery("SELECT Categories.CategoryName, " +
                           "SUM(SUBQUERY.TransactionCredit) as CreditSum, " +
                           "SUM(SUBQUERY.TransactionDebit) as DebitSum, " +
                           "SUM(SUBQUERY.TransactionCredit) - SUM(SUBQUERY.TransactionDebit) as Difference " +
                           "FROM Categories LEFT JOIN " +
                               "(SELECT CategoryName, TransactionCredit, TransactionDebit FROM Transactions WHERE AccountID = " + currentAccountID + 
                               (enableDateFilter ? " AND TransactionDate >= #" + startDate + "# AND TransactionDate <= #" + endDate + "# " : " ") + 
                               ") AS SUBQUERY " + 
                           "ON Categories.CategoryName = SUBQUERY.CategoryName " +
                           "GROUP BY Categories.CategoryName");
SELECT Categories.CategoryName ,
       SUM( SUBQUERY.TransactionCredit ) as CreditSum ,
       SUM( SUBQUERY.TransactionDebit  ) as DebitSum  ,
       SUM( SUBQUERY.TransactionCredit ) -
       SUM( SUBQUERY.TransactionDebit  ) as Difference ,
       SUM( SUBQUERY.TransactionDebit  ) /
       ( SELECT SUM(TransactionDebit)
         FROM Transactions
         WHERE AccountID = {currentAccountId}
       ) as 'Percent of Total Debit'
FROM Categories
LEFT JOIN 
(
    SELECT CategoryName, 
           TransactionCredit, 
           TransactionDebit 
    FROM Transactions 
    WHERE AccountID = {currentAccountID}
      AND TransactionDate >= {startDate}
      AND TransactionDate <= {endDate}
) as SUBQUERY 
ON Categories.CategoryName = SUBQUERY.CategoryName
GROUP BY Categories.CategoryName