the*_*van 1 sql sql-server group-by sql-server-2008-r2 sql-like
我写了一个查询来对税项进行分组,如果税是空的,我不想显示税名.这该怎么做?请检查我的sql server语句:
SELECT
'CENTRAL EXCISE DUTY' AS 'TaxName',
SUM(TaxAmount) AS 'Tax'
FROM
PMT_InvoiceTaxAttribute
WHERE
InvoiceID = 100
AND TaxAttributeName NOT LIKE '%IBR%'
AND TaxAttributeName NOT LIKE '%CST%'
AND TaxAttributeName NOT LIKE '%VAT%'
UNION
SELECT
'CST' AS 'TaxName',
SUM(TaxAmount) AS 'Tax'
FROM
PMT_InvoiceTaxAttribute
WHERE
InvoiceID = 100
AND TaxAttributeName LIKE '%CST%'
UNION
SELECT
'VAT' AS 'TaxName',
SUM(TaxAmount) AS 'Tax'
FROM
PMT_InvoiceTaxAttribute
WHERE
InvoiceID = 100
AND TaxAttributeName LIKE '%VAT%'
Run Code Online (Sandbox Code Playgroud)
此Query为Output提供如下:
TaxName Tax
------------- -----------
CENTRAL EXCISE DUTY 15000
CST NULL
VAT NULL
Run Code Online (Sandbox Code Playgroud)
在这里,我不想显示CST和VAT,因为它具有空值.
试试这个:
SELECT * FROM (
SELECT
'CENTRAL EXCISE DUTY' AS 'TaxName',
SUM(TaxAmount) AS 'Tax'
FROM
PMT_InvoiceTaxAttribute
WHERE
InvoiceID = 100
AND TaxAttributeName NOT LIKE '%IBR%'
AND TaxAttributeName NOT LIKE '%CST%'
AND TaxAttributeName NOT LIKE '%VAT%'
UNION
SELECT
'CST' AS 'TaxName',
SUM(TaxAmount) AS 'Tax'
FROM
PMT_InvoiceTaxAttribute
WHERE
InvoiceID = 100
AND TaxAttributeName LIKE '%CST%'
UNION
SELECT
'VAT' AS 'TaxName',
SUM(TaxAmount) AS 'Tax'
FROM
PMT_InvoiceTaxAttribute
WHERE
InvoiceID = 100
AND TaxAttributeName LIKE '%VAT%') as SomeName
WHERE TAX is NOT NULL
Run Code Online (Sandbox Code Playgroud)
由于您使用的是SQL Server,因此您可以使用公用表表达式对其进行一些简化,并消除最后不想使用的行HAVING;
WITH cte AS (
SELECT
CASE WHEN TaxAttributeName LIKE '%CST%' THEN 'CST'
WHEN TaxAttributeName LIKE '%VAT%' THEN 'VAT'
WHEN TaxAttributeName LIKE '%IBR%' THEN NULL
ELSE 'CENTRAL EXCISE DUTY' END TaxName,
TaxAmount Tax
FROM PMT_InvoiceTaxAttribute
WHERE InvoiceID = 100
)
SELECT TaxName, SUM(Tax) Tax FROM cte
GROUP BY TaxName
HAVING TaxName IS NOT NULL AND SUM(Tax) IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
编辑:只是为了完整性,修复现有查询的最小侵入方法是将其包装在另一个删除您不感兴趣的行的选择中;
SELECT * FROM (
...your query here...
) a_dummy_name_is_required_here
WHERE Tax IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)
注意对原始查询第一个查询的微小差异,如果行设置为CSTVAT,原有的查询将其视作既CST和VAT,而与CTE的第一个查询会指望它CST而已.我怀疑他们没有重叠,但我想我一定会提到它.