繁体   English   中英

使用2个表报告状态SQL查询

[英]Using 2 tables to report on a status SQL Query

我正在写一份报告,为我们的新客户带回Landstatus的报告。 我们有3个选项(金,银和青铜,如果用户未在其中添加状态,则为null)。 数据存储在2个不同的表dbo.tbl_Profile_ProjectLanddbo.Tasks

有时我发现dbo.tbl_Profile_ProjectLand具有不同的土地dbo.Tasks

对于我的报告,我想使用dbo.tbl_Profile_ProjectLand作为我的主表,如果该表没有Landstatus的结果,则在dbo中使用dbo.Tasks

问题是我似乎无法正确查询。 这是我的代码。

SELECT 
Count
            ((CASE WHEN pp.landstatus > 0 THEN pp.landstatus
            ELSE t.landstatus END)) As Taken,
                ls.Description
FROM         dbo.Tasks AS t 
    LEFT JOIN
             tbl_User AS u 
    ON t.TakenBy = u.UserId 
    LEFT JOIN dbo.tbl_Profile_ProjectLand AS pp
ON t.Fk_ProfileID = pp.Fk_ProfileID
    LEFT JOIN
             tbl_DDLandStatus AS ls 
    ON t.LandStatus = ls.Id
    LEFT JOIN 
    dbo.tbl_EnquiryType AS e
    ON t.EnquiryType = e.EnquirytypeId
where
(Month(t.DueDate) = Month(getdate()) 
AND YEAR(t.DueDate) = YEAR(getdate ()))and t.EnquiryType = 1  
GROUP BY 
ls.Description 
ORDER BY ( CASE ls.Description
              WHEN 'Gold - owned' THEN 1
              WHEN 'Silver - identified / offered' THEN 2
              WHEN 'Bronze - no land' THEN 3
              ELSE 0
            END)

这带来了以下结果

Taken   Description
40      NULL
34      Gold - owned
28      Silver - identified / offered
8       Bronze - no land

现在,我已经检查了40空结果和存在空值,这是不正确dbo.tbl_Profile_ProjectLand表,并在6 dbo.Tasks表示铜奖状态。

我希望我已经解释了这个问题,因为我在这里几乎把自己弄糊涂了。 任何帮助将不胜感激。 谢谢

我已经找到了一种方法,但是我似乎无法将它们分组。 这是我的新代码

SELECT 
COUNT ((CASE WHEN pp.landstatus > 0 THEN pp.landstatus
            ELSE t.landstatus END)) As Taken,
((CASE WHEN ls.Description > '' THEN ls.Description
            ELSE lst.description END)) As 'Description'
FROM dbo.Tasks AS t 
LEFT JOIN tbl_DDLandStatus AS lst
    ON t.landstatus = lst.Id 
LEFT JOIN dbo.tbl_Profile_ProjectLand AS pp
    ON t.Fk_ProfileID = pp.Fk_ProfileID
LEFT JOIN tbl_DDLandStatus AS ls 
    ON pp.LandStatus = ls.Id
WHERE (Month(t.DueDate) = Month(getdate()) 
AND YEAR(t.DueDate) = YEAR(getdate ()))and t.EnquiryType = 1  
GROUP BY 
ls.Description,lst.description
ORDER BY ( CASE ls.Description
              WHEN 'Gold - owned' THEN 1
              WHEN 'Silver - identified / offered' THEN 2
              WHEN 'Bronze - no land' THEN 3
              ELSE 0
            END)

这将带回该结果,该结果在现场但未分组。

Taken   Description
22      NULL
7       Bronze - no land
22      Gold - owned
14      Silver - identified / offered
5       Gold - owned
13      Gold - owned
7       Gold - owned
16      Silver - identified / offered
1       Silver - identified / offered
1       Silver - identified / offered
11      Silver - identified / offered

任何想法,我如何可以将它们按描述分组?

您可以修改这种情况并检查吗

Select count(case when pp.landstatus is not null then pp.landstatus 
              ELSE t.landstatus END) as taken , your query

更改联接的性质以适应状态值的差异是正确的。

我想您还会发现您不需要在COUNT()中使用case表达式

您需要做的就是调整组中的最新查询,以使用与描述列相同的大小写表达式。

SELECT
      COUNT(*) as Taken
    , ((CASE
            WHEN ls.Description > ''
                  THEN ls.Description
            ELSE lst.description
      END)) AS 'Description'
FROM dbo.Tasks AS t
      LEFT JOIN tbl_DDLandStatus AS lst             ON t.landstatus = lst.Id
      LEFT JOIN dbo.tbl_Profile_ProjectLand AS pp   ON t.Fk_ProfileID = pp.Fk_ProfileID
      LEFT JOIN tbl_DDLandStatus AS ls              ON pp.LandStatus = ls.Id
WHERE (MONTH(t.DueDate) = MONTH(GETDATE())
      AND YEAR(t.DueDate) = YEAR(GETDATE()))
      AND t.EnquiryType = 1
GROUP BY
      (CASE
            WHEN ls.Description > ''
                  THEN ls.Description
            ELSE lst.description
      END)
ORDER BY
      (CASE ls.Description
            WHEN 'Gold - owned'
                  THEN 1
            WHEN 'Silver - identified / offered'
                  THEN 2
            WHEN 'Bronze - no land'
                  THEN 3
            ELSE 0
      END)

---


下图:先前尝试(失败):不太确定以下这些:

  • 有2个表未引用(需要计数吗?)
  • case表达式等于count(*),我认为您不需要包含else或执行“ else NULL”。

尝试这个:

SELECT
      COUNT
      (CASE
            WHEN pp.landstatus > 0
                  THEN pp.landstatus
      END)                             AS Taken
    , COALESCE(ls.Description, 'NULL') AS Description
FROM dbo.Tasks AS t
  LEFT JOIN tbl_User AS u                      ON t.TakenBy = u.UserId
  LEFT JOIN dbo.tbl_Profile_ProjectLand AS pp  ON t.Fk_ProfileID = pp.Fk_ProfileID
  LEFT JOIN tbl_DDLandStatus AS ls             ON t.LandStatus = ls.Id
  LEFT JOIN dbo.tbl_EnquiryType AS e           ON t.EnquiryType = e.EnquirytypeId
WHERE (MONTH(t.DueDate) = MONTH(GETDATE())
      AND YEAR(t.DueDate) = YEAR(GETDATE()))
      AND t.EnquiryType = 1
GROUP BY
      COALESCE(ls.Description, 'NULL')
ORDER BY
      (CASE ls.Description
            WHEN 'Gold - owned'
                  THEN 1
            WHEN 'Silver - identified / offered'
                  THEN 2
            WHEN 'Bronze - no land'
                  THEN 3
            ELSE 0
      END)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM