我正在使用以下查询来收集有关每个ProductId
的一些信息-请注意,ProductId
可以在dbo.Sales
表中包含多个记录:
SELECT
c.ProductId,
COUNT(*) as NumberOfRecords,
(SELECT
(ISNULL(NULLIF(c.Text, ''), 'FALSE'))) as TextFieldHasData
FROM dbo.Sales c
JOIN dbo.Sources s
ON c.ProductId = s.ProductId
AND s.SourceStatusId in (1,2)
GROUP BY c.ProductId, c.Status, s.SourceStatusId, c.Text
ORDER BY c.ProductId
我需要调整查询的ISNULL
部分,并且语法有麻烦;我真正需要做的是首先检查NumberofRecords
计数-如果给定结果记录的NumberofRecords
计数大于1,则该记录的TextFieldHadData
字段应只显示“不适用”。但是,如果给定结果记录的NumberofRecords
计数= 1,则它应检查c.Text
字段是NULL还是空白。如果为 NULL或空白,则TextFieldHasData
字段将显示“ FALSE”。如果为非 NULL或空白,则TextFieldHasData字段将显示为“ TRUE”。
答案 0 :(得分:2)
查看您的代码,也许您正在寻找类似以下内容的东西(您将在其中分组到ProductId级别):
SELECT
c.ProductId
, COUNT(*) as NumberOfRecords
,
CASE
WHEN COUNT(*) > 1
THEN 'N/A'
ELSE
CASE
WHEN SUM(CASE WHEN ISNULL(c.Text, '') = '' THEN 0 ELSE 1 END) > 0
THEN 'TRUE'
ELSE 'FALSE'
END
END TextFieldHasData
FROM
dbo.Sales c
JOIN dbo.Sources s ON
c.ProductId = s.ProductId
AND s.SourceStatusId in (1, 2)
GROUP BY c.ProductId
ORDER BY c.ProductId
答案 1 :(得分:0)
您可以使用查询:
我无法验证它,因为我没有这些表,但是它应该可以工作,除非您发现较小的语法错误。
这个想法是使用“ case when ... ” sql函数
select v.productid,v.NumberOfRecords,
case
when v.NumberOfRecords>1 then 'N/A'
when v.NumberOfRecords=1 and isnull(v.TextFieldHasData,'') ='' then 'FALSE'
else 'TRUE' end [textfieldhasdata]
from(
SELECT
c.ProductId,
COUNT(*) as NumberOfRecords,
(SELECT
(ISNULL(NULLIF(c.Text, ''), 'FALSE'))) as TextFieldHasData
FROM dbo.Sales c
JOIN dbo.Sources s
ON c.ProductId = s.ProductId
AND s.SourceStatusId in (1,2)
GROUP BY c.ProductId, c.Status, s.SourceStatusId, c.Text) v
ORDER BY ProductId