如何编写SQL查询以选择具有内部联接的百分比?
我有两张桌子 第一桌如何编写SQL查询以选择具有内部联接的百分比?,sql,tsql,Sql,Tsql,我有两张桌子 第一桌 FtID ItemName Days --------------------------------------- 1 Drive 10 2 Run 5 3 Read 21 第二桌 StID FtID Completed (bit) Da
FtID ItemName Days
---------------------------------------
1 Drive 10
2 Run 5
3 Read 21
第二桌
StID FtID Completed (bit) DateTime
-----------------------------------------------------
1 1 0 07/11/2011
2 1 1 08/11/2011
3 1 1 09/11/2011
4 1 0 10/11/2011
5
我需要从两个表中进行选择,并获得如下所示的数据
ItemName Days DaysCompleted DaysIncompleted PercentageCompletion DaysLeft
---------------------------------------------------------------------------------------
Drive 10 2 2 40% 6
正如JNK所指出的,如果Completed确实有一点,那么您需要转换为整数,或者使用SUM/CASE作为他的答案。此外,我还将完成百分比输出为40,如果需要的话。40,那么如果t1.Days不是小数,则需要转换为小数
SELECT
ItemName,
Days,
sum(cast(Completed as integer) as DaysCompleted,
(max(DateTime) - min(DateTime)) - sum(cast(Completed as integer) as Days Incompleted,
(Days - (max(DateTime) - min(DateTime))) / Days as Percentage Completion,
Days - (max(DateTime) - min(DateTime)) as DaysLeft
FROM
Table_1 T1 INNER JOIN Table_2 T2 ON T1.FtID = T2.FtID
GROUP BY
ItemName,
Days
从这个开始/玩转它试试:
SELECT f.ItemName,
f.Days,
SUM(CASE WHEN s.Completed = 1 THEN 1 ELSE 0 END) as DaysCompleted,
SUM(CASE WHEN s.completed = 0 THEN 1 ELSE 0 END) as DaysIncompleted,
CAST((COUNT(s.completed)/f.days) as DECIMAL(10,8)) as PercentageComplete,
(f.days-(COUNT(s.completed)) as DaysLeft
FROM FirstTable F
INNER JOIN SecondTable S
ON F.FTID = S.FTID
GROUP BY f.itemname, f.days
我试着把两张桌子连在一起。但是,当我试图计算第一个变量时,它对我不起作用。如果完成的字段有点小,我认为你不能直接对它进行求和。我做了一些小的更改,它除了DaysLeft之外都有效。它显示我和未完成的日子一样。我需要返回未完成的天数和大于NOW的datetime。我得到错误。不允许从数据类型datetime隐式转换为int。使用CONVERT函数运行此查询。确定-然后使用CONVERT而不是Cast。只是为了了解它,否则,它基本上就是Convertdatatype,field。
SELECT f.ItemName,
f.Days,
SUM(CASE WHEN s.Completed = 1 THEN 1 ELSE 0 END) as DaysCompleted,
SUM(CASE WHEN s.completed = 0 THEN 1 ELSE 0 END) as DaysIncompleted,
CAST((COUNT(s.completed)/f.days) as DECIMAL(10,8)) as PercentageComplete,
(f.days-(COUNT(s.completed)) as DaysLeft
FROM FirstTable F
INNER JOIN SecondTable S
ON F.FTID = S.FTID
GROUP BY f.itemname, f.days