Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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
Sql 空行';由于分组联接表而存在_Sql_Sql Server 2005 - Fatal编程技术网

Sql 空行';由于分组联接表而存在

Sql 空行';由于分组联接表而存在,sql,sql-server-2005,Sql,Sql Server 2005,我正在与groupby和Null斗争,如下所示 我有两张像下面这样的桌子 Table : 1 accountmast companyID accname category 102 PURCHASE ACCOUNT Purchase Account 102 LOCAL PURCHASE Purchase Account 102 SALES ACCOUNT S

我正在与
groupby
Null
斗争,如下所示

我有两张像下面这样的桌子

Table : 1 accountmast       
companyID   accname             category    
102         PURCHASE ACCOUNT    Purchase Account    
102         LOCAL PURCHASE      Purchase Account    
102         SALES ACCOUNT       Sales Account   

Table: 2 ledger     
companyID   name                debit   credit
102         PURCHASE ACCOUNT    4742.3  
102         LOCAL PURCHASE      51106   
102         SALES ACCOUNT               8010
102         SALES ACCOUNT               4330000
102         PURCHASE ACCOUNT    5480000 
我的问题如下:

select  
case    
when a.catagory ='Purchase Account' then    
l.name  
end as PurchaseAccount, 

case    
when a.catagory ='Purchase Account' then    
sum(coalesce(l.debit,0))-sum(coalesce(l.credit,0) ) 
end as PurAmt,  

case    
when a.catagory = 'Sales Account' then  
l.name      
end as SalesAccount,    
case    
when a.catagory = 'Sales Account' then  
sum(coalesce(l.credit,0))-sum(coalesce(l.debit,0) ) 
end as SalesAmt 

from ledger l join accountmast a    
on l.companyID=a.companyID  
and l.name = a.accname  
where l.companyID=102   
and a.catagory IN('Purchase Account','Sales Account')   
group by l.name,a.catagory  
结果是:

Purchase Account    PurAmt          Sales Account   SalesAmt
LOCAL PURCHASE      51106.00         NULL           NULL
PURCHASE ACCOUNT    5484742.30       NULL           NULL
NULL                NULL            SALES ACCOUNT  4338010.00
要求是:

Purchase Account    PurAmt           Sales Account   SalesAmt
LOCAL PURCHASE      51106.00         SALES ACCOUNT   4338010.00
PURCHASE ACCOUNT    5484742.30      
解决办法是什么

如果使用
groupby
,则允许
Null
值关联表的列

如果我使用
MAX
MIN
,那么它会显示单个记录。我该怎么办


如果有人有更好的解决方案,请提出。

注意:这不是一个答案,而是供参考。

WITH    q AS
        (
        SELECT  am.category, l.name,
                CASE am.category WHEN 'Purchase Account' THEN amt ELSE -amt END
        FROM    accountmast am
        CROSS APPLY
                (
                SELECT  name, SUM(COALESCE(credit, 0) - COALESCE(debit, 0)) AS amt
                FROM    ledger l
                WHERE   l.name = am.accname
                        AND l.companyId = am.companyId
                GROUP BY
                        name
                ) l
        WHERE   am.companyId = 102
        )
SELECT  l1.name, l1.amt, l2.name, l2.amt
FROM    (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY name) AS rn
        FROM    q
        WHERE   category = 'Purchase account'
        ) l1
FULL JOIN
        (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY name) AS rn
        FROM    q
        WHERE   category = 'Sales account'
        ) l2
ON      l2.rn = l1.rn
这里我作了一些更正,供你考虑

WITH    q AS
(
SELECT  am.catagory, l.name,
CASE am.catagory WHEN 'Purchase Account' THEN Amount ELSE -Amount     END as Amount -- Here I provide the column name and alter the Column
FROM    accountmast am
    CROSS APPLY
    (
    SELECT  name, SUM(COALESCE(debit, 0) - COALESCE(credit, 0)) AS Amount --Reverse the sum function which is oppose of yours. And your's shows the value in minus.
    FROM    ledger l
    WHERE   l.name = am.accname
    AND l.companyId = am.companyId
    GROUP BY
             name
    ) l
    WHERE   am.companyId = 102
)
SELECT  l1.name as PurACC, l1.Amount as PurAmt, l2.name as SalACC, l2.Amount as SalAmt -- alter the columns for Binding Purpose.
FROM
    (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY name) AS rn
        FROM    q
        WHERE   catagory = 'Purchase account'
    ) l1
FULL JOIN
    (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY name) AS rn
        FROM    q
        WHERE   catagory = 'Sales account'
    ) l2
ON l2.rn = l1.rn

以上更改很重要,否则您的答案仍然不正确并抛出错误检查。

SQL将返回一个表-您希望在第四个位置做什么?每隔一个单词大写一次非常重要。@Mark,对不起,我没有得到第四个位置,哪一个第四个位置?@Mark,如果没有值,则为null elsevalue@Quassnoi,我没有明白你的意思。有一个错误“没有为q的第3列指定列”,你必须在“CASE am.category”行中指定列名称,如“amt”,当“Purchase Account”时,然后是amt ELSE-amt END“as amt”。你的查询显示的销售金额数字与采购金额数字相同。它没有显示sum()好的,关于专栏。它更正了您在MS Sql-2008中的查询,但我使用的是Sql-2005,Sql-2005没有选项。您对ms sql-2008的更正查询在我的sql-2005上没有返回任何内容,返回空值,我很困惑?。否则,您建议的链接将非常有用。@mahesh:查询将在两个引擎上的相同数据上返回相同的值。将小提琴复制到
2005
并查看。这里我提供了新的帖子供您参考。