SQL Server查询-组合Select语句

SQL Server查询-组合Select语句,sql,sql-server,Sql,Sql Server,我有一种感觉,我在这里真的很愚蠢。但是,尽管我花了3个小时的在线研究,我还是看不出我遗漏了什么 我有一个MS-SQL发票表,我正试图按年份和客户参考对其进行分组。这是我提出的问题: SELECT year(INVOICE_DATE)AS YEAR, month (invoice_date)AS MONTH, sum(invoice_net) As invoice_net FROM S50INVOICE --WHERE ACCOUNT_REF = 'ONLINE'

我有一种感觉,我在这里真的很愚蠢。但是,尽管我花了3个小时的在线研究,我还是看不出我遗漏了什么

我有一个MS-SQL发票表,我正试图按年份和客户参考对其进行分组。这是我提出的问题:

SELECT year(INVOICE_DATE)AS YEAR, month (invoice_date)AS MONTH, sum(invoice_net) As invoice_net
FROM            S50INVOICE
--WHERE       ACCOUNT_REF = 'ONLINE' OR Account_ref = 'BADSALES' OR ACCOUNT_REF = 'WEBSALES'
WHERE       ACCOUNT_REF = 'cash'
--WHERE       ACCOUNT_REF <> 'ONLINE' OR Account_ref <> 'BADSALES' OR ACCOUNT_REF <> 'WEBSALES' or ACCOUNT_REF <> 'CASH'
GROUP BY year(invoice_date), month(invoice_date)
order by YEAR, MONTH
选择年(发票日期)作为年,月(发票日期)作为月,金额(发票净额)作为发票净额
来自S50发票
--其中ACCOUNT_REF='ONLINE'或ACCOUNT_REF='BADSALES'或ACCOUNT_REF='WEBSALES'
其中账户_REF=‘现金’
--其中账户参考“在线”或账户参考“不良销售”或账户参考“网络销售”或账户参考“现金”
按年份(发票日期)、月份(发票日期)分组
按年、按月订购
现在,我可以使用其中一个WHERE语句每次运行3次,得到三个年/月/发票净额表

但我希望能够运行一次,并获得一个带有年份/发票/账户参考(条件1)/账户参考(条件2)/账户参考(条件3)的表


我的想法是,我应该使用UNION,但尝试这样做似乎打破了Group语句,我仍然只返回了3列。

是的,这有点棘手,但应该或多或少与我的提案配合使用。 组没有改变,这完全是基于WHERE条件但在CASE子句中计算组总数的方式。 我无法测试它,因为您的问题没有DDL,但是。。。如果可以,请告诉我:

SELECT 
    year(INVOICE_DATE)AS YEAR, 
    month (invoice_date)AS MONTH, 
    SUM(CASE WHEN ACCOUNT_REF = 'ONLINE' 
           OR Account_ref = 'BADSALES' 
           OR ACCOUNT_REF = 'WEBSALES' 
        THEN invoice_net ELSE 0 END) As invoice_net_Cond1,
    SUM(CASE WHEN ACCOUNT_REF = 'cash' 
        THEN invoice_net ELSE 0 END) As invoice_net_Cond2,
    SUM(CASE WHEN ACCOUNT_REF <> 'ONLINE' 
           OR Account_ref <> 'BADSALES' 
           OR ACCOUNT_REF <> 'WEBSALES' 
           or ACCOUNT_REF <> 'CASH'  
        THEN invoice_net ELSE 0 END) As invoice_net_Cond3
FROM S50INVOICE 
GROUP BY year(invoice_date), month(invoice_date) 
ORDER BY YEAR, MONTH;
选择
年份(发票日期)为年份,
月份(发票日期)为月份,
总和(账户_REF=‘在线’时的情况)
或账户_ref=‘不良销售’
或账户_REF='WEBSALES'
然后将发票净额(其他0结束)作为发票净额条件1,
金额(账户_REF=‘现金’时的情况)
然后将发票净额(其他0结束)作为发票净额条件2,
金额(账户参考“在线”时的情况)
或账户参考“不良销售”
或参考“网络销售”的账户
或账户参考“现金”
然后作为发票净额条件3开具发票
来自S50发票
按年份(发票日期)、月份(发票日期)分组
按年度、月份排序;

我认为您需要条件聚合:

SELECT year(INVOICE_DATE) AS YEAR, month (invoice_date) AS MONTH, 
       SUM(CASE WHEN ACCOUNT_REF IN ('ONLINE', 'BADSALES' 'WEBSALES' )
                THEN invoice_net ELSE 0
           END) As invoice_net_Cond1,
       SUM(CASE WHEN ACCOUNT_REF = 'cash' THEN invoice_net ELSE 0
           END) As invoice_net_Cond2,
       SUM(CASE WHEN ACCOUNT_REF NOT IN ('ONLINE', 'BADSALES', 'WEBSALES', 'CASH') 
                THEN invoice_net ELSE 0
           END) As invoice_net_Cond3
FROM S50INVOICE 
GROUP BY year(invoice_date), month(invoice_date) 
ORDER BY YEAR, MONTH;

听起来你应该能够修改你的逻辑,这样你的3WHERE语句就可以被OR分隔了。然后你需要考虑你的分组,账户是唯一的分组吗?如果是,只需在列上使用MIN(..)或MAX使其成为聚合