Как найти количество нескольких записей с разными условиями в одной таблице с многозначными полями - PullRequest
1 голос
/ 18 января 2012

Я задал вопрос ранее сегодня, но у меня есть дополнительный вопрос к тому, который добавляет сложность многозначных полей.

Учитывая следующую таблицу:

ID    lightness    | darkness     | color
------|-------------|--------------|---------
1     |10           | 20           | green, blue, yellow
2     |10           | 08           | green, purple, orange
3     |10           | 10           | black, magenta, orange
4     |20           | 05           | green, creame
5     |10           | 20           | red, purple
6     |10           | 16           | red, white
7     |33           | 20           | brown, red
8     |10           | 10           | green, blue

Я хочу выяснить:

  • Количество записей, где цвет имеет яркость 10
  • Количество записей, где цвет имеет тьму 20

Итак, окончательновывод будет:

Color    | lightness   | darkness   | Total
---------|-------------|------------|---------
green    | 4           | 1          | 5
red      | 2           | 2          | 4
Total    | 6           | 3          | 9

group by потеряет свое значение и результаты будут неверными..value можно использовать в многозначном поле, поэтому я могу сделать следующее: Например:

select * from colortable where color.value = 2

Показать все записи, где есть зеленый

select * from colortable where color.value = 3

Показать все записигде существует красный

Я понимаю, что это действительно плохой дизайн, но я унаследовал это и должен выполнять запросы к данным.

Ответы [ 3 ]

2 голосов
/ 18 января 2012

Поскольку у вас есть столбец значений для нескольких полей, лучшее решение - создать новую таблицу и добавить в нее все известные цвета. Таким образом, ваш новый стол будет выглядеть как

ID | cid | color
---|-----|-------
1  | 2   | green
2  | 3   | red

Теперь у вас есть что объединить!

SELECT p.color, 
       Sum(IIf(lightness=10,1,0)) as lightness, 
       Sum(IIf(darkness=20,1,0)) as darkness,
       lightness+darkness AS Total
FROM colortable c inner join predefinedcolors p on p.id = c.color.value
WHERE c.color.value in (2,3)
GROUP BY c.color, p.conditionid.value
0 голосов
/ 19 января 2012

Вы можете получить свой результат от использования таблицы,


--  ** Function for creating column from colors **

CREATE FUNCTION [dbo].[Split](@String varchar(8000), @Delimiter char(1))       
returns @temptable TABLE (items varchar(8000))       
as       
begin       
    declare @idx int       
    declare @slice varchar(8000)       

    select @idx = 1       
        if len(@String)0)  
            insert into @temptable(Items) values(RTRIM(LTRIM(@slice)))       

        set @String = right(@String,len(@String) - @idx)       
        if len(@String) = 0 break       
    end   
return       
end  
GO

-- ** Create view to get all colors in one column **

Create view [dbo].[vColors]
as
select distinct items from split(
(SELECT SUBSTRING(
 (SELECT ',' + color
FROM colortable
ORDER BY color
FOR XML PATH('')),2,200000) AS CSV_Color),',')

GO

-- ** And Finally get the result from this query **

select items,sum(lightness)lightness,sum(darkness)darkness 
from colortable c inner join vcolors v on c.color like '%'+v.items+'%'
group by items

-- ** output is **

items   lightness   darkness
-------------------------------
black       10      10
blue        20      30
brown       33      20
creame      20      5
green       50      43
magenta     10      10
orange      20      18
purple      20      28
red         53      56
white       10      16
yellow      10      20

0 голосов
/ 18 января 2012

Если есть известный набор цветов, вам нужно создать таблицу "KnownColors", например.

SELECT ColourTable.ID, KnownColour, ColourTable.Lightness, ColourTable.Darkness,
ColourTable.Colour, ColourTable.Lightness, ColourTable.Darkness 
FROM ColourTable, knownColours WHERE (((ColourTable.Colour) Like "*" 
& [KnownColour] & "*") AND ((ColourTable.Lightness)=10) 
AND ((ColourTable.Darkness)=20));

даст вам по одному ряду для каждого цвета, где свет будет 10, а тьма - 20

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...